1. 程式人生 > >Python3-StringIO和BytesIO的總結

Python3-StringIO和BytesIO的總結

StringIO經常被用來作字串的快取,因為StringIO的一些介面和檔案操作是一致的,也就是說同樣的程式碼,可以同時當成檔案操作或者StringIO操作。StringIO的行為與file物件非常像,但它不是磁碟上檔案,而是一個記憶體裡的“檔案”,我們可以將操作磁碟檔案那樣來操作StringIO。一個簡單的例子,讓你對StringIO有一個感性的認識:

import io
#生成一個StringIO物件,
s = io.StringIO()
#write()從讀寫位置將引數s寫入到物件s,引數為str或unicode型別,讀寫位置被移動
s.write('Hello World\n')
#getvalue()用法:返回物件s中的所有資料
print(s.getvalue())
# read(n)用法:引數n用於限定讀取的長度,型別為int,預設為從當前位置讀取物件s中所有的資料。讀取結束後,位置被移動。
s = io.StringIO('Hello World\n')
print(s.read(1))
#結果 H
print(s.read())
#結果 ello World
s = io.StringIO('Hello World\n')
#readline(length)用法:length用於限定讀取的結束位置,型別為int,預設為None,即從當前位置讀取至下一個以'\n'為結束符的當前行。讀位置被移動。
print(s.readline(7))
#結果 Hello W
s = io.StringIO('Hello\n World\n')
print(s.readline(7))
#結果 Hello 
a = '''
Hello
World
this
is
a
tes
'''
# readlines用法::讀取所有行.,返回一個列表,會把換行符給讀取出來,,
s = io.StringIO(a)
print(s.readlines())
#結果['\n', 'Hello\n', 'World\n', 'this\n', 'is\n', 'a\n', 'tes\n']
# StringIO還有一個對應的c語言版的實現,它有更好的效能,但是稍有一點點的區別:
# cStringIO沒有len和pos屬性。(還有,cStringIO不支援Unicode編碼)
# 如果例項化一個帶有預設資料的cStringIO.StringIO類。那麼該例項是read-only的;
# 無預設引數的是cStringIO.StringO,它是可讀寫的。cs = cStringIO.StringO()
# StringIO模組主要用於在記憶體緩衝區中讀寫資料。模組是用類編寫的,只有一個StringIO類,
# 所以它的可用方法都在類中。此類中的大部分函式都與對檔案的操作方法類似。

#利用BytesIO 獲取圖片的大小格式,

import io
from PIL import Image  # 注意我的Image版本是pip3 install Pillow==4.3.0
import requests
res = requests.get('http://p99.pstatp.com/large/pgc-image/95b9aa2664c1441199795f84e2812e39.jpg', stream=True)  # 獲取位元組流最好加stream這個引數,原因見requests官方文件
byte_stream = io.BytesIO(res.content)  # 把請求到的資料轉換為Bytes位元組流(這樣解釋不知道對不對,可以參照有管的教程看一下)
roiImg = Image.open(byte_stream)   # Image開啟Byte位元組流資料
print(roiImg.format)       # 獲取圖片的格式
print(roiImg.size)         #獲取圖片的大小
imgByteArr = io.BytesIO()     # 建立一個空的Bytes物件
imgByteArr = imgByteArr.getvalue()   # 這個就是儲存的圖片位元組流