StringIO与BytesIO
StringIO与BytesIO、类文件对象的用途,应用场景,优、缺点。
StringIO
StringIO 是io 模块中的类,在内存中开辟的一个文本模式的buffer,可以像文件对象一样操作它。当close 方法被调用的时候,这个buffer 会被释放。
好处:一般来说,磁盘的操作比内存的操作要慢的多,内存足够的时候,一般的优化思路是少落地,减少磁盘IO的过程,可以大大提高程序的运行速度。业务中单机情况可以使用StringIo或者BytesIO,多机就考虑使用 redis。
缺点:内存断电,buffer 中的数据会丢失,所以不建议存储很重要的数据,但可以存储日志之类的丢失也没有大影响的数据。
直接导入:form io import StringIO 使用:StringIO()
导入io 模块:import io 使用时调用StringIO方法:io.StringIO()
readline() 逐行读取
getvalue() 获取全部内容:
In [53]: from io import StringIO
In [54]: sio = StringIO()
In [55]: print(sio.readable(),sio.writable(),sio.seekable())
True True True
In [56]: sio.write("hello\nPython")
Out[56]: 12
In [57]: sio.seek(0)
Out[57]: 0
In [58]: sio.readline()
Out[58]: 'hello\n'
In [59]: sio.tell() #读取一行后,文件指针移到了下行行首
Out[59]: 6
In [60]: sio.getvalue() #不受文件指针影响,输出全部内容
Out[60]: 'hello\nPython'
In [61]: sio.close()
BytesIO
BytesIO 也是io模块中的类,内存中开辟的一个二进制模式的buffer,也可以像文件对象一样操作它,当close方法调用的时候,这个buffer也会被释放。
简单使用方法与StringIO 一样:
In [44]: from io import BytesIO
In [45]: bio = BytesIO()
In [46]: print(bio.readable(),bio.writable(),bio.seekable())
True True True
In [47]: bio.write(b'hello\nPython')
Out[47]: 12
In [48]: bio.seek(0)
Out[48]: 0
In [49]: bio.readline()
Out[49]: b'hello\n'
In [50]: bio.tell()
Out[50]: 6
In [51]: bio.getvalue()
Out[51]: b'hello\nPython'
In [52]: bio.close()
file-like对象
类文件对象,可以像文件对象一样操作
socket对象、输入输出对象(stdin、stdout)都是类文件对象
In [1]: from sys import stdout
In [2]: print(type(stdout))
<class 'colorama.ansitowin32.StreamWrapper'> #linux下可能是<class '_io.TextIOWrapper'>
In [3]: stdout.write('hello\nPython\n') #控制台打印
hello
Python
In [4]: stdout.close()