1. StringIO
StringIO的行为与file对象非常像,但它不是磁盘上文件,而是一个内存里的“文件”,我们可以将操作磁盘文件那样来操作StringIO。
因为文件对象和StringIO大部分的方法都是一样的,比如read, readline, readlines, write, writelines都是有的,这样,StringIO就可以非常方便的作为"内存文件对象"。
一个简单的例子,让你对StringIO有一个感性的认识:
from io import StringIO
s =io.StringIO()
s.write("aaaa")
lines = ['xxxxx', 'bbbbbbb']
s.writelines(lines)
s.seek(0)
print(s.read())
print(s.getvalue())
s.write(" ttttttttt ")
s.seek(0)
print(s.readlines())
通过例子,我们看到了StringIO的行为,基本与file一致。StringIO提供了一个方法,可以方便的获取其中的数据:StringIO. getvalue()。如果使用read方法获取其中的数据,必须通过seek先设置"文件指针"的位置。
要读取StringIO,可以用一个str初始化StringIO,然后,像读文件一样读取:
from io import StringIO
f = StringIO('Hello!\nHi!\nGoodbye!')
while True:
s = f.readline()
if s == '':
break
print(s.strip())
"""
运行结果:
Hello!
Hi!
Goodbye!
Process finished with exit code 0
"""
2. BytesIO
StringIO操作的只能是str,如果要操作二进制数据,就需要使用BytesIO。
BytesIO实现了在内存中读写bytes,我们创建一个BytesIO,然后写入一些bytes:
from io import BytesIO
f = BytesIO()
f.write('中文'.encode('utf-8'))
print(f.getvalue())
"""
运行结果:
b'\xe4\xb8\xad\xe6\x96\x87'
Process finished with exit code 0
"""
请注意,写入的不是str,而是经过UTF-8编码的bytes。
和StringIO类似,可以用一个bytes初始化BytesIO,然后,像读文件一样读取:
from io import BytesIO
f = BytesIO(b'\xe4\xb8\xad\xe6\x96\x87')
f.seek(2) # whence:可选,默认值为 0。给 offset 定义一个参数,表示要从哪个位置开始偏移;0 代表从文件开头开始算起,1 代表从当前位置开始算起,2 代表从文件末尾算起。
print(f.read())
"""
运行结果:
b'\xad\xe6\x96\x87'
Process finished with exit code 0
"""
3. 总结
StringIO和BytesIO是在内存中操作str和bytes的方法,使得和读写文件具有一致的接口。
python2中StringIO.StringIO对应python3中io.StringIO
python2中cStringIO.StringIO对应python3中io.BytesIO