第9 2節 Python的檔案開啟函式open詳解

2021-09-25 14:00:06 字數 4740 閱讀 2965

一、 引言

在操作乙個檔案前,大部分情況需要先開啟檔案,才能進行,在python中使用內建函式open來開啟乙個檔案。open函式是python的乙個內建函式,io模組 定義的函式open是該內建函式的同義詞(這是python官網中關於io.open函式的說明,原文如下: 「this is an alias for the builtin open() function」。這裡的this是指io.open),open函式相關常規的操作方式與c語言的fopen函式類似度比較高。

二、 函式呼叫語法及引數釋義

1. 語法:

open(file, mode =『r』, buffering=-1, encoding=none, errors=none, newline=none, closefd=true, opener=none)

2. 引數說明:

open函式的引數老猿認為重要的就是file、mode,這個與c語言的fopen的引數非常類似,其他引數老猿就不展開細說。

1)file引數:

 python官網是這樣說的:「file 是乙個 path-like object,表示將要開啟的檔案的路徑(絕對路徑或者當前工作目錄的相對路徑),也可以是要被封裝的整數型別檔案描述符。(如果是檔案描述符,它會隨著返回的 i/o 物件關閉而關閉,除非 closefd 被設為 false 。)」。

 像open()函式返回的這種有個read()方法的物件,在python中統稱為file-like object。除了file外,還可以是記憶體的位元組流,網路流,自定義流等等。file-like object不要求從特定類繼承,只要寫個read()方法就行。例如stringio就是在記憶體中建立的file-like object,常用作臨時緩衝

 對初學者來說,理解其為可以帶路徑的檔名就可以了,注意如果是windows的路徑帶有反斜槓,需要前面再加反斜槓,防止被python轉義,其實最好的辦法就是用原始字串,即在字串前面加字母r。

 如果是檔案描述符,該檔案描述符應是乙個通過os.open開啟檔案返回的檔案描述符。關於檔案描述符老猿將在後面的文章單獨介紹,大家也可以在網上自己查資料。

2)mode:

檔案開啟的讀寫模式,是乙個可選字串,用於指定開啟檔案的模 式,預設值是 『r』。相關取值及對應模式如下:

老猿認為該模式與 c語言中的檔案模式很像,主要由兩種屬性組合而成:

 檔案的型別:分為文字檔案、二進位制檔案,對應模式中的:t、b。其中t模式是預設模式;

 操作的型別:讀、寫、追加、更新模式,對應模式中的:r、w、a、x、+,分別對應:唯讀、寫、追加寫、排它性建立寫、更新,其中r模式是預設模式,w模式在檔案存在時會截斷檔案清空內容將檔案重置為長度為0的空檔案,不存在時會建立檔案,a模式在檔案存在時不會清空內容,檔案不存在時會建立檔案,x模式是新加的模式,當乙個檔案已經存在時,以x模式開啟會引發fileexistserror,檔案不存在時會建立檔案執行寫入。

注意:以上模式除追加模式外開啟檔案寫入內容時,在沒有指定檔案內容寫入位置的情況下,寫入的地方都是從檔案開頭的位置開始寫入,並且在檔案已經存在的情況下,寫入內容會覆蓋檔案開頭對應長度的內容。追加模式寫入都會追加到檔案末尾。

 更新模式,實際上就是讀寫模式,對應模式中的+,在指定了r模式的情況下啟用更新模式,則檔案內容還可讀寫,但x模式在檔案已經存在的情況下不能使用更新模式。』'r+'和』w+『之間有個重要差別:後者截斷檔案,而前者不會這樣做。

 預設模式為』rt』,這意味著將把檔案視為經過編碼的unicode文字,因此將自動執行解碼和編碼,且預設使用utf-8編碼。要指定其他編碼和unicode錯誤處理策略,可使用關鍵字引數encoding和errors。

3)buffering:

是可選引數,用於設定緩衝策略。傳遞0以關閉緩衝(僅允許在二進位制模式下),1選擇行緩衝(僅在文字模式下可用),並且》1的整數以指示固定大小的塊緩衝區的大小(以位元組為單位)。如果沒有給出 buffering 引數或值為-1,則預設緩衝策略如下:

 二進位制檔案以固定大小的塊進行緩衝;緩衝區的大小嘗試底層裝置的「塊大小」或使用 io.default_buffer_size引數定義的大小。在許多系統上,緩衝區的長度通常為4096或8192位元組。

 「互動式」文字檔案( isatty() 返回 true 的檔案)使用行緩衝。其他文字檔案使用上述用於二進位制檔案的策略。

4)encoding:

在文字模式,如果 encoding 沒有指定,則根據平台環境來決定使用本地編碼,本地編碼可以通過import locale模組後,使用 locale.getpreferredencoding(false) 來獲取。二進位制檔案不需要設定 encoding引數;

5)errors:

是乙個可選的字串引數,用於指定如何處理編碼和解碼錯誤,由於二進位制檔案不能指定編碼方式,因此該引數不能在二進位制模式下使用。錯誤型別包括:

• 『strict』 :如果存在編碼錯誤,會引發 valueerror 異常。 預設值 none 具有相同的效果。

• 『ignore』: 忽略錯誤,請注意,忽略編碼錯誤可能會導致資料丟失。

• 『replace』: 會將替換標記(例如 『?』 )插入有錯誤資料的地方。

• 『surrogateescape』 :將表示任何不正確的位元組作為unicode專用區中的**點,範圍從u+dc80到u+dcff。當在寫入資料時使用 surrogateescape 錯誤處理程式時,這些私有**點將被轉回到相同的位元組中。這對於處理未知編碼的檔案很有用。

• 『xmlcharrefreplace』:只有在寫入檔案時才支援 ,編碼不支援的字元將替換為相應的xml字元引用 nnn;。

• 『backslashreplace』: 用python的反向轉義序列替換格式錯誤的資料。

• 『namereplace』 在檔案寫入時用 \n 轉義序列替換不支援的字元。

6)newline:

換行符,用於 控制識別換行符和換行符讀寫的轉換方式,它僅適用於文字模式,可以是 none、空字串』』、』\n』、』\r』、 『\r\n』以及其他合法的字串。它的工作原理:

• 官網翻譯:「從流中讀取輸入時,如果 newline 為 none,則啟用通用換行模式。輸入中的行可以以 『\n』,』\r』 或 『\r\n』 結尾,這些行結尾符被轉換成 『\n』 。如果它是 『『或引號標識的乙個字串,則啟用通用換行模式,但行結尾將直接返回給訪問者。如果它具有任何其他合法值,則輸入行僅由給定字串終止,並且行結尾將返回給給檔案訪問方」。老猿理解為:

 所有換行符都用來判斷乙個文字的行是否結束,差別是關於換行符讀取後怎麼進行轉換存入到讀入的緩衝中;

 如果換行符是通用換行模式,則』\n』,』\r』 或 『\r\n』都可以作為行 結尾,並且讀取行時,這些符號被轉換成』\n』讀入緩衝中;

 如果該處填空字串,則讀取行的處理同』\n』,』\r』 或 『\r\n』 ,只是』\n』,』\r』 或 '\r\n』這些換行符不會進行轉換,直接原樣讀入緩衝中。

• 將輸出寫入檔案流時,如果 newline 為 none,則寫入的任何 『\n』 字元都將轉換為系統預設行分隔符 os.linesep。如果 newline 是 『』 或 『\n』,則不進行轉換直接寫入。如果 newline 是任何其他合法值,則寫入的任何 『\n』 字元將被轉換為給定的字串。

7)closefd:

這個引數老猿沒有深入研究,大致認為是在第乙個引數file不是檔名而是乙個使用os.open開啟的檔案描述符時,在此指定當本open函式返回的檔案物件關閉後,對應的檔案描述符檔案是否關閉,如果該引數為true則關閉傳入進來的檔案描述符,否則不關閉,該引數在第乙個引數file為檔名時沒有意義;

這個引數老猿沒有完全弄明白作用,老猿猜想有種場景可以使用,就是第乙個引數是通過外部介面傳入的file是乙個檔案描述符,此時為了相容通過檔名訪問的功能,因此需要將其轉換為檔案物件進行操作,需要使用該引數確保傳入的檔案描述符不會關閉,以便外部介面後續能繼續正常執行。

8)opener:

這個引數老猿沒有深入研究,它是乙個可呼叫的函式,該函式的目的是為了定製自己的檔案開啟操作函式,且這個檔案開啟操作函式的引數是open函式的第乙個引數file和第二個引數mode,返回值是乙個檔案描述符(即通過os.open返回的型別),系統預設是呼叫的就是os.open,所以該引數傳os.open與傳none是相同的結果。

老猿沒有弄明白這個引數opener的作用,可能在操作者需要深度控制檔案訪問邏輯時使用。

三、 函式返回結果

如果檔案成功開啟, open() 函式所返回的 file object 型別取決於所用模式。 當使用 open() 以文字模式 (『w』, 『r』, 『wt』, 『rt』 等) 開啟檔案時,它將返回 io.textiobase 的乙個子類 。 當使用緩衝以二進位制模式開啟檔案時,返回的類是 io.bufferediobase 的乙個子類。 具體的類會有多種:在唯讀的二進位制模式下,它將返回 io.bufferedreader;在寫入二進位制和追加二進位制模式下,它將返回 io.bufferedwriter,而在讀/寫模式下,它將返回 io.bufferedrandom。 當禁用緩衝時,則會返回原始流,即 io.rawiobase 的乙個子類 io.fileio。

如果該檔案不能開啟,則觸發 oserror及相關異常。

第2節 python實現檔案讀取

使用read csv方法讀取,結果為dataframe格式 在讀取csv檔案時,檔名稱盡量是英文 引數較多,可以自行控制,但多數時候使用預設引數 讀取csv時,注意編碼,常用的編碼為utf 8 gbk gbk2312和gb18030等。使用to csv快速儲存。讀取csv檔案 import nump...

Python開發 第6節 檔案操作

格式 open 檔案路徑 開啟模式 返回值 檔案io物件 開啟模式一共n種 w模式 寫模式write 檔案不存在時會建立檔案,如果檔案已存在則會清空檔案 r模式 讀模式read 檔案不存在就報錯,存在則準備讀取檔案 x模式 抑或模式 檔案存在則報錯,檔案不存在則新建檔案 b模式 二進位制模式 bin...

python開啟檔案 Python檔案開啟模式

python 內建函式 python 內建函式 python open 函式用於開啟乙個檔案,建立乙個 file 物件,相關的方法才可以呼叫它進行讀寫。寫入檔案時,不會自動加入換行,需要手動在末尾加入,在每個元素後面都換行n,可以用 fo.writelines line n for line in ...