io.open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True)
打開file對象並返回對應的數據流。如果打開失敗,則拋出IOError異常。
file要么是一個指向需要被打開文件的路徑字符串,或者是文件描述符序號。
mode是一個可選字符串,用來指明打開文件的模式。默認為'r',意思是可讀文本模式。另一個常見的參數值是'w',表示寫入(如果文件存在,則首先清空文件內容。)。'a'表示追加,在某些Unix系統中表示無論當前處於文本什么位置,所以內容都要追加到文件末尾。在文本模式中,如果沒有指明編碼,則默認使用操作系統的編碼。(對於原始字節的讀寫使用二進制模式,而不在乎編碼是否指定。)以下是可用的模式:
字符 | 含義 |
'r' | 只讀模式(默認) |
'w' | 清空原文件,寫入模式。 |
'a' | 寫入模式,如果文件存在 則追加到文件末尾。 |
'b' | 二進制模式。 |
't' | 文本模式(默認) |
'+' | 打開磁盤文件進行更新(讀寫) |
'U' | 通用新行模式(只為向后兼容,不推薦再使用。) |
默認的模式是'rt'(文本可讀)。對於二進制訪問,'w+b'模式會打開並清空文件,而'r+b'只打開文件而不清空。
Python區分文件的打開方式是二進制還是文本,哪怕底層的操作系統不區分它們。用二進制模式(即在mode參數中包含'b')打開的文件會以字節對象返回,不進行任何解碼。在文本模式(缺省情況或者是mode參數中包含't')下,字節會首先被按照指定的編碼方式進行解碼,如果沒有給出指定的編碼方式,則使用操作系統默認的編碼方式。
buffering是一個可選的整數,用來設置buffering策略。0表示關閉buffering(只在二進制模式下),1表示選擇行進行緩沖(buffering)(僅限於文本模式),大於1的整數表示選擇固定大小的塊進行緩沖。如果沒有給定buffering參數,默認的緩沖策略如下:
- 二進制文件按照固定大小的塊進行緩沖;Python首先試圖確定底層設備的block size,然后賦給DEFAULT_BUFFER_SIZE。在許多系統中,緩沖大小一般是4096或者8192個字節。
- 交互式文本文件(isatty()返回True的文件)使用行緩沖。其他文本文件使用跟二進制文件一樣的策略。
encoding是編碼名稱,用以編碼或者解碼文件。這只在文本模式中使用。默認的編碼方式是系統的編碼方式(即locale.getpreferredencoding()返回值),任何Python支持的編碼都可以充當該參數。查看codec模塊了解所有被支持的編碼。
errors是一個可選字符串,用以指明如何處理編碼或解碼異常,該參數在二進制模式不可用。傳入'strict'用以在編碼異常發生時拋出ValueError異常,或者使用'ignore'忽略異常。(注意:忽略編碼異常可能導致數據丟失。)'replace'表示遇見不規則數據時插入一個替換符(例如?)代替它。'xmlcharrefreplace'表示使用合適的XML字符參考進行替換,'backslashreplace'表示使用反斜杠代替。任何注冊到codecs.register_error()中的異常處理名稱都是有效的。
newline表示如何使用通用新行來標識一個新行。它可能是None,'','\n','\r'以及'\r\n'。它的工作方式如下:
- 在輸入時,如果newline是None,通用新行模式打開。輸入的新行可以'\n', '\r'或 '\r\n'結尾,它們在被返回給調用者之前都將被轉義成'\n'。如果它是'',新行模式打開,新行將被原樣返回給調用者。如果新行中包含任何有效字符,該行只會以給定的字符來確定該行結束。
- 在輸出時,如果newline是None,'\n'將是默認的行分隔符(即os.linesep)。如果新行是'',則不會進行轉義。如果新行包含任何有效字符,'\n'字符串將轉義成給定字符串。
如果closefd為False,並且給定的是文件描述符而不是文件名,當文件關閉的時候,底層的文件描述符仍然保持開啟。如果給定了文件名,則closefd無效而且必須是True(默認就是True)。
open()函數返回的文件對象取決於模式。當使用文本模式打開文件時,它返回一個TextIOBase的子類。當使用二進制打開時,返回的是BufferedIOBase的子類。准確細分為:可讀二進制模式,返回BufferReader對象;在可寫和追加模式中,返回BufferWriter對象,在讀寫模式中,返回BufferRandom。當buffering關閉時,原始數據流,一個RawIOBase的子類將被返回。
還可以使用unicode或者字節字符串當作一個文件來進行讀寫。對於unicode字符串,將像文本一樣使用StringIO對其進行處理,而二進制則使用BytesIO。