在Linux系統中,一切都是檔案。但我們通常說的檔案是儲存在磁碟上的圖片、文件、資料、程式等等。而在程式的IO操作中,很多時候就是從磁碟讀寫檔案。本節我們講解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中讀寫的內容分字串和位元組物件兩種,這分別對應檔案開啟的文字模式和二進位制模式。
我的公眾號:猿人學 Python 上會分享更多心得體會,敬請關注。
***版權申明:若沒有特殊說明,文章皆是猿人學 yuanrenxue.com 原創,沒有猿人學授權,請勿以任何形式轉載。***