前言
养成一个好的习惯只需要坚持21天,Day12
IO进程
- 文件读写
读写文件前,我们先必须了解一下,在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘,所以,读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从这个文件对象中读取数据(读文件),或者把数据写入这个文件对象(写文件)。
读文件
使用Python的内置函数open()
,传入文件名和标识符:
f = open('/Users/Comme_moi/Desktop/test.rtf','r')
标志符’r’表示读操作,这样就成功打开了一个文件。如果文件不存在,open()
函数就会抛出IOError
的错误,并且给出错误的详细信息和不存在,比如:FileNotFoundError: [Errno 2] No such file or directory: '/Users/Comme_moi/Desktop/test'
。
如果文件打开成功,调用read()
方法可以一次读取文件的全部内容,Python把内容读到内存,用一个str对象表示:
f.read()
# 'Hello, world!'
最后一步调用f.close()
关闭文件。文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的:
f.close()
如果文件读写时出现错误,后面的f.close就不会调用。所以为了保证无论是否出错都能正确地关闭文件,就可以使用try...finally
:
try:
f = open('/Users/Comme_moi/Desktop/test.rtf','r')
print(f.read())
finally:
if f:
f.close()
一般的,Python中我们引入with
语句来自动调用close()
方法:
with open('/Users/Comme_moi/Desktop/test.rtf',‘r’)as f:
print(f.read())
另外,调用readline()
可以每次读取一行内容,调用readlines()
一次读取所有内容并按行返回list:
for line in f.readlines():
print(line.strip()) # 把末尾的'\n'删掉
二进制文件
上面都是默认读取文本文件,并且文本文件是用UTF-8编码的。要读取二进制文件,比如视频、图片的时候,我们就要使用‘rb’模式打开文件,否则会出错:
f = open('/Users/Comme_moi/Desktop/img.png','rb')
print(f.read())
# b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00G\x00\x00\x005\x08\x06\...
字符编码
要读取非UTF-8编码的文本文件,需要给open()
函数传入encoding
参数,例如,读取GBK编码的文件:
>>> f = open('/Users/Comme_moi/Desktop/img.rtf', 'r', encoding='gbk')
>>> f.read()
# '测试'
如果遇到UnicodeDecodeError
,可以添加一个errors
参数,直接忽略:
f = open('/Users/Comme_moi/Desktop/img.rtf', 'r', encoding='gbk', errors='ignore')
写文件
写文件和读文件相似,区别是传入标志符'w'
或者'wb'
表示写文本文件或写二进制文件:
with open('/Users/Comme_moi/Desktop/test.rtf','w') as f:
f.write('Test succed!')
要写入特定编码的文本文件,请给open()
函数传入encoding
参数,将字符串自动转换成指定编码。