Python檔案讀寫、StringIO和BytesIO

weixin_34249678發表於2018-12-06

輸入輸出是相對的,要考慮具體的物件是什麼。

由於CPU和記憶體的速度遠遠高於外設的速度,所以,在IO程式設計中,就存在速度嚴重不匹配的問題。舉個例子來說,比如要把100M的資料寫入磁碟,CPU輸出100M的資料只需要0.01秒,可是磁碟要接收這100M資料可能需要10秒,怎麼辦呢?有兩種辦法:

第一種是CPU等著,也就是程式暫停執行後續程式碼,等100M的資料在10秒後寫入磁碟,再接著往下執行,這種模式稱為同步IO。

另一種方法是CPU不等待,只是告訴磁碟,“您老慢慢寫,不著急,我接著幹別的事去了”,於是,後續程式碼可以立刻接著執行,這種模式稱為非同步IO。

同步和非同步的區別就在於是否等待IO執行的結果。

使用非同步IO來編寫程式效能會遠遠高於同步IO,但是非同步IO的缺點是程式設計模型複雜。

回撥模式:服務員跑過來找你

輪詢模式:發簡訊通知

操作IO的能力都是由作業系統提供的,每一種程式語言都會把作業系統提供的低階C介面封裝起來方便使用,Python也不例外。

讀寫檔案是最常見的IO操作。Python內建了讀寫檔案的函式,用法和C是相容的。

讀寫檔案前,我們先必須瞭解一下,在磁碟上讀寫檔案的功能都是由作業系統提供的,現代作業系統不允許普通的程式直接操作磁碟,所以,讀寫檔案就是請求作業系統開啟一個檔案物件(通常稱為檔案描述符),然後,通過作業系統提供的介面從這個檔案物件中讀取資料(讀檔案),或者把資料寫入這個檔案物件(寫檔案)。

2 讀檔案

使用Python內建的open()函式,傳入檔名和標示符

如果檔案不存在,open()函式就會丟擲一個IOError的錯誤,並且給出錯誤碼和詳細的資訊告訴你檔案不存在

如果檔案開啟成功,接下來,呼叫read()方法可以一次讀取檔案的全部內容,Python把內容讀到記憶體,用一個str物件表示

最後一步是呼叫close()方法關閉檔案。檔案使用完畢後必須關閉,因為檔案物件會佔用作業系統的資源,並且作業系統同一時間能開啟的檔案數量也是有限的

由於檔案讀寫時都有可能產生IOError(輸入/輸出操作失敗),一旦出錯,後面的f.close()就不會呼叫。所以,為了保證無論是否出錯都能正確地關閉檔案,我們可以使用try ... finally來實現:

11422128-4c13ae790706c067.png

注:

11422128-a9e96ec89efa0250.png
11422128-3136458006fce987.png
11422128-6a1497eca377ef92.png

Python引入了with語句來自動幫我們呼叫close()方法:

11422128-efa1317870d6b96f.png

4 StringIO和BytesIO

很多時候,資料讀寫不一定是檔案,也可以在記憶體中讀寫。StringIO就是在記憶體中讀寫str。

要把str寫入StringIO,我們需要先建立一個StringIO,然後,像檔案一樣寫入即可:

11422128-fdc94ba7b3c8d39c.png

getvalue()方法用於獲得寫入後的str

要讀取StringIO,可以用一個str初始化StringIO,然後,像讀檔案一樣讀取:

11422128-2f7e0fcb94537f7e.png

StringIO操作的只能是str,如果要操作二進位制資料,就需要使用BytesIO

BytesIO實現了在記憶體中讀寫bytes,我們建立一個BytesIO,然後寫入一些bytes:

11422128-9ed867b5c7e81506.png

注意,寫入的不是str,而是經過UTF-8編碼的bytes。

和StringIO類似,可以用一個bytes初始化BytesIO,然後,像讀檔案一樣讀取:

11422128-167f27b4b316b5f5.png

相關文章