python文件读写,以后就用with open语句
读写文件是最常见的IO操作。 Python内置了读写文件的函数,其用法与C兼容。
在读写文件之前,我们首先要了解,在磁盘上读写文件的功能是由操作系统提供的。现代操作系统不允许普通程序直接操作磁盘。因此,读写文件就是请求操作系统打开一个文件。一个文件对象(通常称为文件描述符),然后通过操作系统提供的接口,从文件对象中读取数据(读文件),或者将数据写入文件对象(写文件)。
读文件
要以文件读取模式打开文件对象,请使用 Python 内置的 open() 函数,传入文件名和标识符:
>>> f = open('/Users/michael/test.txt','r')
标示符'r'表示读,这样,我们就成功地打开了一个文件。
如果文件不存在,open() 函数将抛出一个带有错误代码和详细信息的 IOError,告诉你文件不存在:
>>> f=open('/Users/michael/notfound.txt','r')
Traceback (most recent call last):
File "", line 1,inFileNotFoundError: [Errno 2] No such fileordirectory:'/Users/michael/notfound.txt'
如果文件打开成功,接下来调用read()方法一次性读取文件的全部内容,Python将内容读入内存,用str对象表示:
>>> f.read()'Hello, world!'
最后一步是调用close()方法关闭文件。文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的:
>>> f.close()
由于文件读写时都有可能产生IOError,一旦出错,后面的f.close()就不会调用。所以,为了保证无论是否出错都能正确地关闭文件,我们可以使用try ... finally来实现:
try:
f = open('/path/to/file','r')
print(f.read())finally:
if f:
f.close()
但是每次都这样写太麻烦了,所以Python引入了with语句来自动为我们调用close()方法:
with open('/path/to/file','r') as f:
print(f.read())
这个和前面的try...finally是一样的,但是代码更简洁,不用调用f.close()方法。
调用 read() 将一次读取文件的全部内容。如果文件有10G,内存就会爆炸。因此,为了安全起见,你可以重复调用 read(size) 方法,每次最多读取 size 个字节。 .或者,调用 readline() 一次读取一行,调用 readlines() 一次读取所有内容并逐行返回列表。因此,需要根据需要来决定如何调用。
如果文件很小,read() 一次读取最方便;如果无法确定文件大小,重复调用 read(size) 会更安全;如果是配置文件,调用readlines()最方便:
forlinein f.readlines():
print(line.strip())# 把末尾的'\n'删掉
写文件
写文件和读文件一样,唯一的区别是调用open()函数时,传入标识符'w'或'wb'表示写文本文件或写二进制文件:
>>> f = open('/Users/michael/test.txt','w')>>> f.write('Hello, world!')>>> f.close()
你可以重复调用 write() 来写入文件,但一定要调用 f.close() 来关闭文件。我们在写文件的时候,操作系统往往不会立即将数据写入磁盘,而是将其存储在内存缓存中,空闲的时候再慢慢写入。只有调用 close() 方法时,操作系统才会保证所有未写入的数据都会写入磁盘。忘记调用 close() 的后果是只有部分数据可能写入磁盘,其余的则丢失。因此,为了安全起见,仍然使用 with 语句:
with open('/Users/michael/test.txt','w') as f:
f.write('Hello, world!')
要编写具有特定编码的文本文件,请将编码参数传递给 open() 函数以自动将字符串转换为指定的编码
字符编码
读取非UTF-8编码的文本文件,需要将encoding参数传递给open()函数,例如读取GBK编码的文件:
>>> f = open('/Users/michael/gbk.txt','r', encoding='gbk')>>> f.read()'测试'
遇到有些编码不规范的文件,你可能会遇到UnicodeDecodeError,因为在文本文件中可能夹杂了一些非法编码的字符。遇到这种情况,open()函数还接收一个errors参数,表示如果遇到编码错误后如何处理。最简单的方式是直接忽略:
>>> f = open('/Users/michael/gbk.txt','r', encoding='gbk', errors='ignore')
二进制文件
上面提到的默认是读取文本文件,它们是 UTF-8 编码的文本文件。要读取二进制文件,例如图像、视频等,请以 'rb' 模式打开文件:
>>> f = open('/Users/michael/test.jpg','rb')>>> f.read()
b'\xff\xd8\xff\xe1\x00\x18Exif\x00\x00...'# 十六进制表示的字节
总结:以后用with open语句读写文件,不要像以前那样用f = open()。
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ python文件排序的方法有哪些10/26
- ♥ Python列表常用操作总结12/09
- ♥ python3教程中随机生成的字符串12/14
- ♥ python如何调用api接口测试11/21
- ♥ python如何判断字典key是否包含字符k11/22
- ♥ python3元素判断的代码怎么写?01/12
内容反馈