Python 檔案讀寫(Python IO)

veelion發表於2019-03-03

在Linux系統中,一切都是檔案。但我們通常說的檔案是儲存在磁碟上的圖片、文件、資料、程式等等。而在程式的IO操作中,很多時候就是從磁碟讀寫檔案。本節我們講解Python中的檔案物件如何操作檔案。

Python 檔案讀寫

建立檔案物件

通過Python內建函式open()可以很容易的建立一個檔案物件。open函式有很多引數,最常用的有兩個,使用open函式最常用的方法是:open(filename, mode)

f = open('myfile', 'w') 

第一個引數filename是檔名的字串,比如myfile。第二個引數也是一個字串,表示檔案使用方式。mode的可選項如下:

mode 含義
‘r’ 以只讀模式開啟(預設)
‘w’ 以可寫模式開啟,並清楚檔案內容(如果檔案存在的話)
‘x’ 建立一個新檔案並以可寫模式開啟
‘a’ 以可寫模式開啟,從檔案末尾開始寫入(如果檔案存在的話)
‘b’ 二進位制模式
‘t’ 文字模式(預設)
’+’ 開啟一個已存在檔案以便進行更新(讀和寫)

其中的'b''t'是指定檔案內容是文字還是二進位制,其它都說是關於讀寫方式的。

'b'是二進位制模式開啟檔案,讀寫的資料都是位元組物件(bytes),這個模式可以讀寫一切檔案,包括文字檔案,但讀寫文字檔案時要注意編碼的問題。
't'是文字模式下讀寫檔案。讀取時,預設會把平臺特定的行結束符 (Unix 上的\n, Windows 上的 \r\n)轉換為\n。寫入是,預設會把出現的\n 轉換回平臺特定的結束符。這種預設的“幕後修改”對文字檔案來說沒有問題,但會破壞二進位制資料(比如,JPEG或exe)檔案中的資料。

在使用open建立檔案物件時,最好使用 with 關鍵字。其好處是,當字句體結束後檔案會正確關閉,即使在某個時刻引發了異常。並且with比等效的try-finally程式碼塊更簡短:

In [102]: with open('myfile') as f: 
     ...:     data = f.read() 
     ...:

In [103]: f.closed   
Out[103]: True

如果沒使用with關鍵字,就要呼叫f.close()來關閉檔案並立即釋放它使用的系統資源。如果沒有顯示的關閉檔案,Python的垃圾回收器最終將銷燬該物件併為你關閉開啟的檔案,但這個檔案可能會保持開啟狀態一段時間。另外一個風險是不同的Python實現會在不同的時間進行清理。

通過 with 語句或者呼叫 f.close() 關閉檔案物件後,嘗試使用該檔案物件將自動失敗。

檔案物件的方法

通過上面的方法建立檔案物件f後,,我們就可以通過其對應的方法讀寫資料了。

(1)寫內容到檔案:f.write(string)
把內容寫入檔案的方法是write()方法,傳遞的物件必須是字串(文字模式下)或位元組物件(二進位制模式下)。如果要寫入其它型別的物件(比如,字典、列表等等),就要先把它們轉換成字串(文字模式下)或位元組物件(二進位制模式下)。

In [109]: f = open('myfile', 'w')

In [110]: f.write('猿人學Python,就是檔案的全部內容。\n')
Out[110]: 21

In [111]: f.close()

(2)讀取檔案內容:f.read(size)
它會讀取檔案裡面的資料並將其返回為字串(在文字模式下),或者位元組物件(二進位制模式)。引數size是一個可選的整數引數,當size被省略或為負的時候,讀取檔案的全部內容;如果檔案的大小是機器記憶體的兩倍或更大,那麼可能出現錯誤。讀取並返回的size大小的內容。如果已經讀完全部內容(到達檔案末尾),將返回一個空字串。

In [112]: f = open('myfile')

In [113]: f.read()
Out[113]: '猿人學Python,就是檔案的全部內容。\n'

In [114]: f.read()
Out[114]: ''

f.readline() 從檔案讀取一行,換行符\n留住字串末尾;
f.readlines() 讀取檔案所有行,返回一個字串的列表;

In [118]: f.readline()
Out[118]: '猿人學Python,就是檔案的全部內容。\n'

In [119]: f.seek(0)
Out[119]: 0

In [120]: f.readlines()
Out[120]: ['猿人學Python,就是檔案的全部內容。\n']

遍歷檔案的所有行,也可以用遍歷檔案物件的方式,這是記憶體高效、快速並簡單的方式:

In [122]: for line in f: 
     ...:     print(line) 
     ...:
猿人學Python,就是檔案的全部內容。

(3)檔案物件的位置
前面的例子中,我們已經讀到檔案的末尾,如果要再從頭讀的話就要呼叫f.seek(0)來設定檔案物件的位置到檔案開頭。這個方法有兩個引數:f.seek(cookie, whence=0)

  • cookie 是位置偏移量
  • whence 是相對位置,它有三種相對位置:
    • 0 檔案開頭,偏移量是0或整數;
    • 1 當前位置,偏移量可以是負數;
    • 2 檔案末尾,偏移量通常是負數;

如何檢視當前位置呢?呼叫f.tell()方法。

總結

檔案讀寫是程式設計中經常需要的操作,Python3中讀寫的內容分字串和位元組物件兩種,這分別對應檔案開啟的文字模式和二進位制模式。

猿人學banner宣傳圖

我的公眾號:猿人學 Python 上會分享更多心得體會,敬請關注。

***版權申明:若沒有特殊說明,文章皆是猿人學 yuanrenxue.com 原創,沒有猿人學授權,請勿以任何形式轉載。***

相關文章