python开发基础----文件操作
操作文件的流程:
#1. 打开文件,得到文件句柄并赋值给一个变量 #2. 通过句柄对文件进行操作 #3. 关闭文件
open()的函数原型 open(file, mode=‘r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True) buffering的可取值有0,1, >1三个,0代表buffer关闭(只适用于二进制模式),1代表line buffer(只适用于文本模式),>1表示初始化的buffer大小; encoding表示的是返回的数据采用何种编码,一般采用utf8或者gbk; errors的取值一般有strict,ignore,当取strict的时候,字符编码出现问题的时候,会报错,当取ignore的时候,编码出现问题,程序会忽略而过,继续执行下面的程序。 newline可以取的值有None, \n, \r, '', ‘\r\n' ,用于区分换行符,但是这个参数只对文本模式有效; closefd的取值,是与传入的文件参数有关,默认情况下为True,传入的file参数为文件的文件名,取值为False的时候,file只能是文件描述符,什么是文件描述符,就是一个非负整数,在Unix内核的系统中,打开一个文件,便会返回一个文件描述符。
在python中
#1. 打开文件,得到文件句柄并赋值给一个变量
f=open('a.txt','r',encoding='utf-8') #默认打开模式就为r
#2. 通过句柄对文件进行操作
data=f.read()
#3. 关闭文件
f.close()
f=open('a.txt','r')的过程分析
#1、由应用程序向操作系统发起系统调用open(...) #2、操作系统打开该文件,并返回一个文件句柄给应用程序 #3、应用程序将文件句柄赋值给变量f
强调!!!
#强调第一点:
打开一个文件包含两部分资源:操作系统级打开的文件+应用程序的变量。在操作完毕一个文件时,必须把与该文件的这两部分资源一个不落地回收,回收方法为:
1、f.close() #回收操作系统级打开的文件
2、del f #回收应用程序级的变量
其中del f一定要发生在f.close()之后,否则就会导致操作系统打开的文件还没有关闭,白白占用资源,
而python自动的垃圾回收机制决定了我们无需考虑del f,这就要求我们,在操作完毕文件后,一定要记住f.close()
虽然我这么说,但是很多同学还是会很不要脸地忘记f.close(),对于这些不长脑子的同学,我们推荐傻瓜式操作方式:使用with关键字来帮我们管理上下文
with open('a.txt','w') as f: #文件内容只能是字符串,不能是其他类型
    pass
 
with open('a.txt','r') as read_f,open('b.txt','w') as write_f:
    data=read_f.read()
    write_f.write(data)
强调第一点:资源回收
#强调第二点: f=open(...)是由操作系统打开文件,那么如果我们没有为open指定编码,那么打开文件的默认编码很明显是操作系统说了算了,操作系统会用自己的默认编码去打开文件,在windows下是gbk,在linux
下是utf-8。 这就用到了上节课讲的字符编码的知识:若要保证不乱码,文件以什么方式存的,就要以什么方式打开。 f=open('a.txt','r',encoding='utf-8')
python2中的file与open
#首先在python3中操作文件只有一种选择,那就是open() #而在python2中则有两种方式:file()与open() 两者都能够打开文件,对文件进行操作,也具有相似的用法和参数,但是,这两种文件打开方式有本质的区别,file为文件类,用file()来打开文件,相当于这是在构造文件类,而用open()打开文件,是
用python的内建函数来操作,我们一般使用open()打开文件进行操作,而用file当做一个类型,比如type(f) is file
打开文件的模式
文件句柄 = open('文件路径', '模式')
模式可以是以下方式以及他们之间的组合:
| Character | Meaning | 
| ‘r' | open for reading (default) | 
| ‘w' | open for writing, truncating the file first | 
| ‘a' | open for writing, appending to the end of the file if it exists | 
| ‘b' | binary mode | 
| ‘t' | text mode (default) | 
| ‘+' | open a disk file for updating (reading and writing) | 
| ‘U' | universal newline mode (for backwards compatibility; should not be used in new code) | 
#1. 打开文件的模式有(默认为文本模式): 注意如果以 w 或者 w+ 的模式写入文件,文件都会被清空 r ,只读模式【默认模式,文件必须存在,不存在则抛出异常】 w,只写模式【不可读;不存在则创建;存在则清空内容】 a, 之追加写模式【不可读;不存在则创建;存在则只追加内容】 #2. 对于非文本文件,我们只能使用b模式,"b"表示以字节的方式操作(而所有文件也都是以字节的形式存储的,使用这种模式无需考虑文本文件的字符编码、图片文件的jgp格式、视频文件的avi格式) rb wb ab 注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码
wb写入时,不能直接写入字符串,需要把字符串转换为bytes类型,然后指定编码再写入
字符串转换为bytes类型的方法有两种,(注意直接在字符串前加b是不行的,如果是中文会出现问题)
- 第一种
bytes('1111\n',encoding='utf-8')
- 第二种
'1111\n'.encode('utf-8')
#3. 了解部分 "+" 表示可以同时读写某个文件 r+, 读写【可读,可写】 w+,写读【可读,可写】 a+, 写读【可读,可写】 x, 只写模式【不可读;不存在则创建,存在则报错】 x+ ,写读【可读,可写】 xb
# 回车与换行的来龙去脉 http://www.cnblogs.com/linhaifeng/articles/8477592.html # U模式 'U' mode is deprecated and will raise an exception in future versions of Python. It has no effect in Python 3. Use newline to control universal newlines mode. # 总结: 在python3中使用默认的newline=None即可,换行符无论何种平台统一用\n即可 了解U模式与换行符
操作文件的方法 ,注意:read(3)代表读取3个字符,其余文件内光标移动都是以字节为单位如seek,tell,truncate
#掌握
f.read() #读取所有内容,光标移动到文件末尾
f.readline() #读取一行内容,光标移动到第二行首部
f.readlines() #读取每一行内容,存放于列表中
f.write('1111\n222\n') #针对文本模式的写,需要自己写换行符
f.write('1111\n222\n'.encode('utf-8')) #针对b模式的写,需要自己写换行符
f.writelines(['333\n','444\n']) #文件模式
f.writelines([bytes('333\n',encoding='utf-8'),'444\n'.encode('utf-8')]) #b模式
#了解
f.readable() #文件是否可读
f.writable() #文件是否可读
f.closed #文件是否关闭
f.encoding #如果文件打开模式为b,则没有该属性
f.flush() #立刻将文件内容从内存刷到硬盘
f.name #文件名
f.tell() #当前光标所在位置
f.truncate(10) #将文件从头开始截取10个字节,然后覆盖源文件,这里的读取文件方式不能是w 或 w+ 
f.seek(0) #将光标移动到第0个字节,默认从文件开头算 
seek(offset[, whence]) #注意如果whence参数不为默认值0,那打开文件的方式必须是以 b 的方式打开 ,如果参数为2,从末尾开始的话,offset偏移量的值应该为负数,
- 
offset -- 开始的偏移量,也就是代表需要移动偏移的字节数 
- 
whence:可选,默认值为 0。给offset参数一个定义,表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。 
如果操作成功,则返回新的文件位置,如果操作失败,则函数返回 -1。
f = open('xxx','r',encoding='utf-8')
循环文件的推荐方式
for i in f:
    print(i)
 
seek高级用法取文件最后一行 如下文件: 2019/09/05 alex 干了件事情 2019/09/06 alex 干了件事情 2019/09/07 alex 干了件事情 2019/09/08 alex 干了件事情 2019/09/09 alex 干了件事情 2019/09/10 sb 干了件事情 f = open('LOG','rb') num = 10 for i in f: while True: seeks = f.seek(-num,2) data = f.readlines() if len(data) > 1: break num += 10 print(data[-1].decode('utf-8')) f.close()
 
                    
                 
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号