IO
由于CPU和内存的速度远远高于外设的速度,所以,在IO编程中,就存在速度严重不匹配的问题。
如要把100M的数据写入磁盘,CPU输出100M的数据只需要0.01秒,可是磁盘要接收这100M数据可能需要10秒,怎么办呢?有两种办法:
第一种是CPU等着,也就是程序暂停执行后续代码,等100M的数据在10秒后写入磁盘,再接着往下执行,这种模式称为同步IO;
另一种方法是CPU不等待,只是告诉磁盘,“您慢慢写,不着急,我接着干别的事去了”,于是,后续代码可以立刻接着执行,这种模式称为异步IO。
同步和异步的区别就在于是否等待IO执行的结果。
文件读写
读文件
以读文件的模式打开一个文件对象,Python内置的open()函数,传入文件名和标示符
>>> f = open('/Users/michael/test.txt', 'r')
标示符'r'表示读
如果文件不存在,open()函数就会抛出一个IOError的错误
如果文件打开成功,调用read()方法可以一次读取文件的全部内容
>>> f.read()
'Hello, world!'#Python把内容读到内存,用一个str对象表示
close()方法关闭文件
>>> f.close()
调用read(size)方法,每次最多读取size个字节的内容。
调用readline()可以每次读取一行内容,
调用readlines()一次读取所有内容并按行返回list。
为了保证无论是否出错都能正确地关闭文件,我们可以使用try ... finally来实现:
try:
f = open('/path/to/file', 'r')
print(f.read())
finally:
if f:
f.close()
简化:
with open('/path/to/file', 'r') as f:
print(f.read())
这和前面的try ... finally是一样的,但是代码更佳简洁,并且不必调用f.close()方法。
二进制文件
要读取二进制文件,比如图片、视频等等,用'rb'模式打开文件
>>> f = open('/Users/michael/test.jpg', 'rb')
>>> f.read()
b'xffxd8xffxe1x00x18Exifx00x00...' # 十六进制表示的字节
要读取非UTF-8编码的文本文件,需要给open()函数传入encoding参数,例如,读取GBK编码的文件:
>>> f = open('/Users/michael/gbk.txt', 'r', encoding='gbk')
>>> f.read()
'测试'
遇到有些编码不规范的文件,pen()函数还接收一个errors参数
>>> f = open('/Users/michael/gbk.txt', 'r', encoding='gbk', errors='ignore')
写文件
传入标识符'w'或者'wb'表示写文本文件或写二进制文件:
>>> f = open('/Users/michael/test.txt', 'w')
>>> f.write('Hello, world!')
防止丢失使用with语句
with语句
with open('/Users/michael/test.txt', 'w') as f:
f.write('Hello, world!')
追加到文件末尾
传入'a'以追加(append)模式写入