Python StringIO与BytesIO、类文件对象

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()

  

 

posted @ 2017-10-26 11:31  ihoneysec  阅读(3642)  评论(0编辑  收藏  举报