在Linux系統中,一切都是文件。但咱們一般說的文件是保存在磁盤上的圖片、文檔、數據、程序等等。而在程序的IO操做中,不少時候就是從磁盤讀寫文件。本節咱們講解Python中的文件對象如何操做文件。cookie
經過Python內置函數open()
能夠很容易的建立一個文件對象。open函數有不少參數,最經常使用的有兩個,使用open函數最經常使用的方法是:open(filename, mode)
。函數
f = open('myfile', 'w')
第一個參數filename
是文件名的字符串,好比myfile
。第二個參數也是一個字符串,表示文件使用方式。mode
的可選項以下:編碼
mode | 含義 |
---|---|
‘r’ | 以只讀模式打開(默認) |
‘w’ | 以可寫模式打開,並清楚文件內容(若是文件存在的話) |
‘x’ | 建立一個新文件並以可寫模式打開 |
‘a’ | 以可寫模式打開,從文件末尾開始寫入(若是文件存在的話) |
‘b’ | 二進制模式 |
‘t’ | 文本模式(默認) |
’+’ | 打開一個已存在文件以便進行更新(讀和寫) |
其中的'b'
和't'
是指定文件內容是文本仍是二進制,其它都說是關於讀寫方式的。spa
'b'
是二進制模式打開文件,讀寫的數據都是字節對象(bytes),這個模式能夠讀寫一切文件,包括文本文件,但讀寫文本文件時要注意編碼的問題。't'
是文本模式下讀寫文件。讀取時,默認會把平臺特定的行結束符 (Unix 上的\n
, Windows 上的 \r\n
)轉換爲\n
。寫入是,默認會把出現的\n
轉換回平臺特定的結束符。這種默認的「幕後修改」對文本文件來講沒有問題,但會破壞二進制數據(好比,JPEG或exe)文件中的數據。code
在使用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()
方法,傳遞的對象必須是字符串(文本模式下)或字節對象(二進制模式下)。若是要寫入其它類型的對象(好比,字典、列表等等),就要先把它們轉換成字符串(文本模式下)或字節對象(二進制模式下)。rem
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)
whence 是相對位置,它有三種相對位置:
如何查看當前位置呢?調用f.tell()
方法。