Python廖雪峰教程学习笔记:Day12

前言

养成一个好的习惯只需要坚持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参数,将字符串自动转换成指定编码。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章