Python open()開啟檔案

2020-07-16 10:05:27
檔案的操作主要分為讀取和寫入兩種,讀取檔案是指將磁碟上的檔案內容讀入記憶體或命名管道,寫入檔案則是將記憶體、緩衝區或命名管道內的內容寫入磁碟上指定檔案。Python 中操作檔案也有兩種常用方法,一是使用內建支援的 file 物件完成大部分檔案操作,二是使用 os 模組提供的更為豐富的函數完成對檔案和目錄的操作。

在讀取或寫入檔案之前,必須使用內建函數 open( ) 開啟它,其語法是:

file object = open(filename [, accessmode="r"] [, buffering="-1"] [, encoding=None] [, errors=None] [, newline=None] [, closefd=True] [, opener=None])

其中 filename 是要存取的檔案的檔案名字符串,accessmode 用於指定檔案開啟的模式,詳細的模式見表 1。

表 1:open( ) 函數的 accessmode 引數
模式 描述
r 以唯讀方式開啟檔案,指標指向檔案頭
rb 以唯讀方式開啟二進位制檔案,指標指向檔案頭
r+ 以讀寫方式開啟檔案,指標指向檔案頭
rb+ 以讀寫方式開啟二進位制檔案,指標指向檔案頭
w 以只寫方式開啟檔案,若檔案已存在則覆蓋該檔案,若檔案不存在則建立新檔案
wb 以只寫方式開啟二進位制檔案,若檔案已存在則覆蓋該檔案,若檔案不存在則建立新檔案
w+ 以讀寫方式開啟檔案,若檔案已存在則覆蓋該檔案,若檔案不存在則建立新檔案
wb+ 以讀寫方式開啟二進位制檔案,若檔案已存在則覆蓋該檔案,若檔案不存在則建立新檔案
a 以追加方式開啟檔案,指標指向檔案尾,若檔案不存在則建立新檔案
ab 以追加方式開啟二進位制檔案,指標指向檔案尾,若檔案不存在則建立新檔案
a+ 以追加、讀寫方式開啟檔案,指標指向檔案尾,若檔案不存在則建立新檔案
ab+ 以追加、讀寫方式開啟二進位制檔案,指標指向檔案尾,若檔案不存在則建立新檔案

通常,檔案以文字模式被開啟,這意味著從檔案讀出和向檔案寫入的字串會被特定的編碼方式(預設是 UTF-8)編碼。而以二進位制模式開啟檔案表示資料會以位元組物件的形式讀出和寫入,這種模式應該用於儲存非文字內容的檔案。

在文字模式下,讀取時預設會將平台有關的行結束符(UNIX 上是 n,Windows 上是 rn)轉換為 n,在文字模式下寫入時預設會將出現的 n 轉換成平台有關的行結束符,這種做法可能會損壞二進位制檔案,因此對不同型別的檔案要採用正確的模式讀寫。

buffering 用於指明存取檔案時的緩衝區設定,取值為 0 表示不使用緩衝,取值為 1 表示在存取檔案進行時使用行緩衝(僅用於文字模式),取值為大於 1 的整數表示使用固定大小的緩衝區進行緩衝,取值為負數表示使用系統預設大小的緩衝區。

encoding 用於編碼或解碼檔案的編碼名稱。該引數應僅用於文字模式,預設的編碼是平台依賴的。

errors 用於指定如何操作編、解碼的錯誤,此引數不能用於二進位制模式。常見的可取值如表 2 所示。

表 2:open() 函數的 errors 引數
可取值 描述
strict 或 None 如果有編碼錯誤,引發 ValueError 異常
ignore 忽略錯誤
replace 在出現畸形資料的地方插入替代符號
surrogateescape 將任何不正確的位元組以 Unicode Private Use Area 中的程式碼點表示
xmlcharrefreplace 編碼不支援的字元會用適當的 XML 字元替換,只支援寫入檔案
backslashreplace 使用反斜槓跳脫序列替換畸形資料
namereplace 使用n{…}跳脫序列替換不支援的字元,只支援寫入檔案

newline 用於控制通用換行模式如何執行(只支援文字模式),取值可以是 None、(空串)、n、r 和 rn。當讀取輸入時,如果取值為 None,啟用通用換行模式,輸入中的行尾可以是 n、r或rn,在返回給呼叫者前會被轉換為n;如果引數值是(空串)也將啟用通用換行模式,但是返回給呼叫者時行尾不做轉換;

如果取值為其他任意合法值,輸入行以給定字串結束,返回給呼叫者時行尾也不做轉換。當輸出寫入時,如果取值為None,任意寫入的n將被轉換為系統預設的行分隔符;如果取值為(空串)或 n,不進行轉換;如果取值為其他任意合法值,所有寫入的 n 字元將轉換為給定字串。

closefd 指明關閉檔案時檔案描述符的狀態。若 closefd 為 False,且給定檔案描述符(注意不是檔名),則當檔案關閉時檔案描述符將保持開啟。若給定檔名,則 closefd 必須為 True(預設),否則將引發錯誤。

opener 用於傳遞呼叫一個自定義開啟器,通過呼叫 opener 獲取檔案物件的檔案描述符。

以下程式碼使用內建支援的 file 物件展示了常見的檔案操作:
#開啟檔案
f = open("test.txt", "w+")
#獲取檔案描述符
print(f.fileno())
#寫入文字
f.write("Python 語言很強大。n是的,的確非常強大!n")
#關閉檔案
f.close()
#以唯讀方式開啟檔案
f = open("test.txt", "r")
#讀取檔案內容並輸出至終端螢幕
print(f.read())
#關閉開啟的檔案
f.close()
上述程式碼的執行結果如下所示:

>>> f = open("test.txt", "w+")
>>> print(f.fileno())
3
>>> f.write("Python 語言很強大。n是的,的確非常強大!n")
25
>>> f.close()
>>> f = open("test.txt", "r")
>>> print(f.read())
Python 語言很強大。
是的,的確非常強大!

>>> f.close()


生成的 test.txt 檔案的內容如下所示:

Python 語言很強大。
是的,的確非常強大!