【python】文件的读写
一、文件是储存在辅助器上的数据序列,展现形态分为文本文件和二进制文件,以二进制形式储存。
(1)文本文件
由单一特定编码组成的文件,如UTF-8编码,文本文件存储的是常规字符串,由若干文本行组成,通常每行以换行符'\n'结尾。常规字符串是指记事本之类的文本编辑器能正常显示、编辑并且人类能够直接阅读和理解的字符串,如英文字母、汉字、数字字符串。在Windows平台中,扩展名为.txt、.log、.ini的文件都属于文本文件,可以使用字处理软件如gedit、记事本进行编辑。
(2)二进制文件
直接由比特0和1组成,没有统一的字符编码。常见的如图形图像文件、音视频文件、可执行文件、资源文件、各种数据库文件、各类office文档等都属于二进制文件。二进制文件把信息以字节串(bytes)进行存储,无法用记事本或其他普通字处理软件直接进行编辑,通常也无法被人类直接阅读和理解,需要使用对应的软件进行解码后读取、显示、修改或执行。例如,图6-1中使用Windows记事本打开Python主程序文件pythonw.exe,由于这个文件是二进制可执行文件,无法使用记事本查看,所以显示乱码。
二、文件内容操作三步走:打开、读写、关闭。
- open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
file参数指定了被打开的文件名称。
mode参数指定了打开文件后的处理方式。
buffering参数指定了读写文件的缓存模式。0表示不缓存,1表示缓存,如大于1则表示缓冲区的大小。默认值是缓存模式。
encoding参数指定对文本进行编码和解码的方式,只适用于文本模式,可以使用Python支持的任何格式,如GBK、utf8、CP936等等。
如果执行正常,open()函数返回1个文件对象,通过该文件对象可以对文件进行读写操作。如果指定文件不存在、访问权限不够、磁盘空间不足或其他原因导致创建文件对象失败则抛出异常。
f1 = open( 'file1.txt', 'r' ) # 以读模式打开文件
f2 = open( 'file2.txt', 'w') # 以写模式打开文件
当对文件内容操作完以后,一定要关闭文件对象,这样才能保证所做的任何修改都确实被保存到文件中。
f1.close()
文件的打开:<变量名(文件句柄)>=open(<文件名>,<打开模式>)
文件的打开方式
模式 说明
r 读模式(默认模式,可省略),如果文件不存在则抛出异常
w 写模式,如果文件已存在,先清空原有内容
x 写模式,创建新文件,如果文件已存在则抛出异常
a 追加模式,不覆盖文件中原有内容
b 二进制模式(可与其他模式组合使用)
t 文本模式(默认模式,可省略)
+ 读、写模式(可与其他模式组合使用)
文件对象常用属性
属性 说明
buffer 返回当前文件的缓冲区对象
closed 判断文件是否关闭,若文件已关闭则返回True
fileno 文件号,一般不需要太关心这个数字
mode 返回文件的打开模式
name 返回文件的名称
文件对象常用方法
方法 功能说明
close() 把缓冲区的内容写入文件,同时关闭文件,并释放文件对象
detach() 分离并返回底层的缓冲,底层缓冲被分离后,文件对象不再可用,不允许做任何操作
flush() 把缓冲区的内容写入文件,但不关闭文件
read([size]) 从文本文件中读取size个字符(Python 3.x)的内容作为结果返回,或从二进制文件中读取指定数量的字节并返回,如果省略size则表示读取所有内容
readable() 测试当前文件是否可读
readline() 从文本文件中读取一行内容作为结果返回
readlines() 把文本文件中的每行文本作为一个字符串存入列表中,返回该列表,对于大文件会占用较多内存,不建议使用
seek(offset[, whence]) 把文件指针移动到新的字节位置,offset表示相对于whence的位置。whence为0表示从文件头开始计算,1表示从当前位置开始计算,2表示从文件尾开始计算,默认为0
seekable() 测试当前文件是否支持随机访问,如果文件不支持随机访问,则调用方法seek()、tell()和truncate()时会抛出异常
tell() 返回文件指针的当前位置
truncate([size]) 删除从当前指针位置到文件末尾的内容。如果指定了size,则不论指针在什么位置都只留下前size个字节,其余的一律删除
write(s) 把s的内容写入文件
writable() 测试当前文件是否可写
writelines(s) 把字符串列表写入文本文件,不添加换行符
例1 向文本文件中写入内容
s = 'Hello world\n文本文件的读取方法\n文本文件的写入方法\n'
f = open('sample.txt', 'a+') #打开文件
f.write(s) #写入文件内容
f.close() #关闭文件
例2 读取文本文件内容
>>> fp = open('sample.txt')
>>> print(fp.read(4)) #从当前位置读取前4个字符
Hell
>>> print(fp.read(18)) #英文字符和汉字一样对待
o world
>>> print(fp.read()) #从当前位置读取后面的所有内容
>>> fp.close() #关闭文件对象
例3 读取并显示文本文件所有行
with open('sample.txt') as fp:
for line in fp: #文件对象是可以迭代的
print(line)