Python3-StringIO和BytesIO的總結
阿新 • • 發佈:2018-12-13
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() # 這個就是儲存的圖片位元組流