Python中IO概述


  Python中的io模塊是用來處理各種類型的I/O操作流。主要有三種類型的I/O類型:文本I/O(Text I/O),二進制I/O(Binary I/O)和原始I/O(Raw I/O)。它們都是通用類別,每一種都有不同的后備存儲。屬於這些類別中的任何一個的具體對象稱為文件對象,其他常用的術語為流或者類文件對象。

  除了它的類別,每一種具體的流對象也具有各種功能:它僅僅允許讀,或者僅僅允許寫,或者既能讀又能寫。它也允許任意隨機訪問(向前或者向后尋找任何位置),或者僅僅順序訪問(例如在套接字或管道中)。

  所有的流對於提供給它們的數據的數據類型都很嚴格。例如,如果用一個二進制流的write()方法寫一個字符類型的數據,那么將會觸發一個TypeError錯誤。用文本流的write()方法來寫字節對象數據也是一樣的,會觸發該錯誤。

Text I/O
  Text I/O期望輸入和產生的是字符對象。這意味着無論何時,本地存儲都是存儲字節組(比如在文件中),數據的編碼和解碼是透明的,特定平台中換行符字符的翻譯也是透明的(windows下換行翻譯為:\r\n,而linux中為\n,mac中則又不同,但是這些跨平台的換行符Text I\O會自動根據操作系統平台來轉換)。
  最簡單的創造文本流的方法就是用open()函數,指定編碼格式是可選的。

f = open("myfile.txt", "r", encoding = "utf-8")

  內存中的文本流也可以通過StringIO對象得到:(其中的some initial text data 保存在內存中,而不是硬盤的文件中)

f = io.StringIO("some initial text data")

  文本流的api細節描述在文檔中的TextIOBase部分。

Binary I/O
  Binary I/O希望輸入的是類字節對象,創造的是字節組對象。不會執行編碼,解碼和換行符轉換操作。這種類型的流可以用於各種無文本數據,或者還需要手動控制的正在處理的文本數據時。
  最簡單的構造二進制流的方法就是用open(),在模式串中加上’b’

f = open("myfile.jpg", "rb")

  內存中的二進制流也可以用BytesIO對象來創造:

f = io.BytesIO(b"some initial binary data: \x00\x01")

  二進制流api詳細的描述細節在文檔中的BufferedIOBase部分。
  其他庫模塊可能提供一些額外的方法來創造文本流或二進制流。例如socket.socket.makefile()

Raw I/O
  原始I/O(也稱為無緩沖I/O)通常用作二進制流和文本流的低級構造塊。從用戶代碼中直接操作原始流的用法很少見。然而,你可以通過用二進制模式打開一個文件並禁用緩存來構造一個原始流:

f = open("myfile,jpg", "rb", buffering = 0)

  關於原始流api的具體細節描述在RawIOBase文檔部分。

高級模塊
io默認緩沖區大小:
  一個int類型數據指定了模塊的緩沖區I\O類的默認緩沖區大小。如果可以的話,open()直接使用文件的塊大小作為緩沖區大小(包含在os.stat()中)

io.open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True. open=None)
這是內置的open()函數的默認形式

In-memory sterams內存中的流
  也可以用個字符串或者類字節對象作為文件進行讀和寫操作。對於字符串StringIO可以被用作一個用文本模式打開的文件一樣,BytesIO可以被用作一個用二進制模式打開的文件一樣。兩者都提供訪問的完全的讀寫功能。

I/O操作的類層次結構
  在I/O操作最頂層的類是抽象基類IOBase。它定義了流的基本的接口。但是值得注意的是,IOBase中讀取流和寫入流是沒有分開的。實現該基類時,如果給定的操作沒有實現,則可以引發一個UnsupportedOperation錯誤。

  RawIOBase繼承自IOBase。它處理的是從流中讀取或者向流中寫入字節,FileIO是RawIOBase的子類,為文件系統中的文件提供接口。

  BufferedIOBase處理原始字節流(RawIOBase)上的緩沖。它的子類有,bufferdWriter,BufferedReader,BufferedRWPair等帶緩沖區的流,分別是可讀的流,可寫的流,既可讀又可寫的流。BufferedRandow提供了一個帶緩沖區的接口給隨機訪問流。BufferedIOBase的另一個子類,BytesIO是內存中的字節流。

  TextIOBase是IOBase的另一個子類,處理文本形式的字節流,並且處理相應的對字符串的編碼和解碼操作。TextIOWrapper是從TextIOBase中繼承而來,是為帶緩沖區的原始流提供的帶緩沖區的文本接口。最后,StringIO是內存中的文本流。

  參數名稱不是規范的一部分,只有open()函數中的參數被用作關鍵字參數。
  下圖總結了io模塊提供的抽象基礎類(abstract base classes)

 引申:python中改變標准輸出編碼的方式:

   

在做接口request時可能會遇到以下問題:

UnicodeEncodeError: 'gbk' codec can't encode character '\xbb' in position 0: illegal multibyte sequence

出現以上問題是由於編碼的問題,使用以下方法可以改變Python標准輸出的默認編碼:

1、sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf8')            #改變標准輸出默認編碼為utf-8

修改了python的默認編碼為utf8,並賦予了我們的stdout輸出,使得python的輸出默認編碼為utf8

2、sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='gb18030')    #改變標准輸出默認編碼為gb18030(gbk)
修改了python的默認編碼為gb18030(gbk),並賦予了我們的stdout輸出,使得python的輸出默認編碼為gb18030(gbk)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM