在IO编程中,存在速度严重不匹配的问题(CPU和内存的速度与外设的速度不同)。 解决方法:
- 同步IO: CPU等待,程序暂停执行后续代码,等读写完成再执行。
- 异步IO: CPU不等待,后续代码接着执行。
1 文件读写
1.1 读文件
# 读文件
# 1 打开文件对象,如果文件不存在,会抛出异常信息
f=open('/Users/Mac/mydata/iotest.txt','r') # 'r'表示读
# 2 读取文件中的全部内容
str=f.read()
print(str)
# 3 关闭资源
f.close()
# 加上 try catch 写法:
try:
f = open('/Users/Mac/mydata/iotest.txt', 'r') # 'r'表示读
print(f.read())
finally:
if f:
f.close()
# 简便写法,不需要调用close()方法,会捕获异常
with open('/Users/Mac/mydata/iotest.txt','r') as f:
print(f.read())
读取方法:
- read(),一次性读取所有内容。
- read(size),每次最多读取size个字节的内容,在不能确定文件大小的时候用。
- readline(),每次读取一行内容。
- readlines(),一次读取所有内容并按行返回list,读取配置文件时使用。
with open('/Users/Mac/mydata/iotest.txt','r') as f:
for line in f.readlines():
print(line.strip()) # strip()把末尾的'\n'去掉
open()方法中其他参数:
f1=open('path','rb',encoding='gbk',errors='ignore')
# 'rb':打开文件模式,此为读取二进制文件,例如:图片
# encoding:给定字符编码,读取指定编码的文件,默认为utf-8
# errors:遇到编码错误后的处理
1.2 写文件
'''
写文件时,操作系统通常不会立刻将数据写入到硬盘,而是放到内存中缓存起来,空闲的时候再写。
只用调用close()方法时,操作系统才会保证把没有写入的数据全部写入到硬盘中。
'''
with open('/Users/Mac/mydata/iotest.txt','w') as f:
f.write('hello hello.')
# 'w' 模式会覆盖掉文件中原有的内容,使用'a'来实现追加写入
with open('/Users/Mac/mydata/iotest.txt','a') as f:
f.write('hello hoython.')
2 StringIO 和 BytesIO
2.1 StringIO
很多时候,数据读写不一定是文件,也可以在内存中进行读写。
StringIO,就是在内存中读写str
from io import StringIO
# 1 把str写入
f=StringIO()
f.write('hello world.\n hello python.\n hello world.')
# 获取写入后的str
print(f.getvalue())
# 2 读取str
s=f.readlines()
for str in s:
print(str)
2.2 BytesIO
BytesIO,操作二进制文件。
from io import BytesIO
# 创建对象
f=BytesIO()
# 写入内容
f.write('中文'.encode('utf-8'))
# 获取写入的值
print(f.getvalue())