io模块提供python处理各种I/O的主要工具。有三种主要的I/O类型:Text I/O、Binary I/O和Raw I/O。属于这些类别的对象通常称为流。Raw I/O通常用作二进制和文本流的低级构建块,很少拿来直接操作,在此不再赘述。
磁盘上读写文件的功能是由操作系统提供的,现代操作系统不允许普通程序直接操作磁盘。读写文件是请求操作系统打开一个文件对象(文件描述符),然后,通过操作系统提供的接口从这个文件对象中读取数据,或者把数据写入这个对象文件。
Text I/O
读文件
打开一个文件:
f = open("file.txt", "r", encoding="utf-8")
‘r’表示读,encoding表示将字符串转换为指定编码。打开文件后,读取文件:
f.read()
read()方法会一次性将文件中的文本都读取出。运行结果如下:
hello
how are you
I'm fine
我们还可以读取每行的数据。
f.readlines()
结果为:
['hello\n','how are you\n',"I'm fine"]
可以看到的是,readlines()函数返回的是一个列表,列表元素就是每行的数据。当然我们还可以循环调用readline()方法,它每次只返回一行的数据。
读取完文件后,需要关闭文件。
f.close()
需要特别注意的是,文件使用完后一定要关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是一定的。
当文件读且报错时,close()方法不会调用。我们当然会想到使用try…finally的方法保证文件一定会关闭。但是这种方法还是有点麻烦,我们通常使用如下方法:
with open("file.txt", "r", encoding="utf-8") as f:
print(f.read())
不用调用close()方法也会将文件关闭。
写文件
写文件和读文件类似。
with open("file.txt", "w", encoding="utf-8") as f:
f.write('thank you')
使用‘w’表示读。然后调用write()方法对文件进行写操作。
Binary I/O
二进制I/O产生一个bytes对象,这类流通常用于各种非文本数据,它的操作方式和Text I/O类似,只不过读取方式和写入方式分别为‘rb’和‘wb’。
f = open("myfile.jpg", "rb")
内存中二进制流可使用BytesIO对象:
>>> b = io.BytesIO(b"abcdef")
>>> view = b.getbuffer()
>>> view[2:4] = b"56"
>>> b.getvalue()
b'ab56ef'