Python基础入门10(文件读写)
本文主要内容来自,廖雪峰Python教程
加以个人的一些总结或心得(也许有)
学习前需要了解的知识:
磁盘上读写文件的功能都是由操作系统推荐提供的。
现代操作层系统,不允许普通的程序直接操作磁盘。
所以,读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),
然后,通过操作系统提供的接口从这个文件对象中读取数据(读文件),或者把数据写入这个文件对象(写文件)
读文件
以读文件的模式打开一个文件对象,使用Python内饰的 open() 函数,
传入 文件名 和 标示符
E.g
>>>f=open('文件名?还是文件位置','r')
r 表示读,成功打开了一个文件
如果文件不存在, open() 会抛出一个 IOError的错误,给出错误吗和详细的信息报告说明文件不存在。
如果文件打开成功,调用 read() 方法,
f.read([size])
可以从文件中读取指定字节数,未给定或负则读取所有
可以一次读取文件的全部内容,Python把内容读到内存,用一个 str 对象表示
E.g
>>>f.read()
'Hello world!'
最后一步是调用 close() 方法关闭文件,文件使用完毕必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的
E.g
>>>f.close()
由于,文件读写时都有可能产生IOError,一旦出错,后面的 f.close() 就不会调用。
所以,为了保证无论出错是否都能正确地关闭文件,可以使用 try finally来实现
E.g
try:
f=open('/path/to/file','r')
print(f.read())
finally:
if f:
f.close()
每次都这么写会很繁琐,所以,Python引入了 with 语句来自动帮我们调用 close()方法:
E.g
with open('/path/to/file' , ' r ') as f:
print(f.read())
这个与上文的例子相同,代码更加简洁,且不用调用 f.close()
调用 read()会一次性读取文件的全部内容,如果文件有10G,内容就爆了,
所以,保险起见,可以反复调用 read(size) 方法,每次最多读取size字节的内容。
另外,调用 readline() 可以每次读取一行内容,调用 **readlines()**一次读所有内容并按行返回 list。因此,按需调用。
如果文件很小,read() 一次性读取最方便;
如果不能确定文件大小,反复调用 read(size) 比较保险;
如果是配置文件,调用 readlines() 最方便。
E.g
for line in f.readlines():
print(line.strip()) # 把末尾的'\n'删掉
二进制文件
前面讲的都是默认读取文本文件,并且是UTF-8编码的文本文档。要读取二进制文件,比如图片、视频等等,用’ rb '模式打开文件即可。
>>> f = open('/Users/micheal/test.jpg', ' rb ')
>>>f.read()
b'\xff\xd8\xff\xe1\x00\x18Exif\x00\x00...' # 十六进制表示的字节
字符编码
要读取非UTF-8编码的文本文件,需要给 open()函数传入 **encoding()**参数。
例如,读取GBK编码的文件:
E.g
>>>f = open('/Users/michael/gbk.txt', 'r', encoding='gbk')
>>>f.read()
'测试'
遇到有些编码不规范的文件,也可能会遇到UnicodeDecodeError,因为在文本文件中可能夹杂一些非法编码的字符。在这种情况下,open() 函数还接收一个 errors 参数,表示如果遇到编码错误后如何处理。
最简单的方式是直接忽略:
>>>f = open('/User/micheal/gkb.txt', 'r' ,encoding='gkb',errors='ignore')
写文件
写文件和读文件一样的,调用 open()函数的时,传入标识符 ’ w ’ 或者 ’ wb '来表示写文本文件或写二进制文件:
>>>f = open('/Users/micheal/test.txt', 'w')
>>>f.write('Hello,world!')
>>>f.close()
可以通过反复调用write()来写入文件,但是一定要调用 f.close()来关闭文件。
当我们写文件时,操作系统往往不会立刻把数据写入磁盘,而是放到内存缓存起来,空闲的时候再慢慢写入。
只有调用 close()时,操作系统才保证把没有写入的数据全部写入磁盘。忘记调用 close()的后果是数据可能只写了一部分到磁盘,剩下的丢失了。
所以还是用 with 语句来得保险:
>>>with open('文件路径','w') as f:
f.write('Hello,world!')
要写入特定编码的文本文档,请给 open()函数传入 encoding 参数,将字符串自动转换成指定编码。
以’ w ‘模式写入文件时,如果文件已存在,会直接覆盖(相当于删掉后新写入一个文件)。
以’ a '模式写入文件,可以追加到文件末尾。