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