一、區別
使用open打開文件,必須要使用close關閉文件,所以,為了保證無論是否出錯都能正確地關閉文件。
with open可以不用close()方法關閉文件,無論在文件使用中遇到什么問題都能安全的退出,即使發生錯誤,退出運行時環境時也能安全退出文件並給出報錯信息。
二、open用法
三、with open用法
如果是配置文件,調用readlines()最方便:
相關參數:
file對象的屬性:
四、打開文件逐行讀取技巧
1.readline,優點:節省內存,不需要一次性把文件內容放入內存中缺點:速度相對較慢
2.readlines,一次性讀取所有行,內存消耗過大
3.直接for循環
4.read,類似readline
調用read()會一次性讀取文件的全部內容,如果文件有10G,內存就爆了,所以,要保險起見,可以反復調用read(size)方法,每次最多讀取size個字節的內容。另外,調用readline()可以每次讀取一行內容,調用readlines()一次讀取所有內容並按行返回list。因此,要根據需要決定怎么調用。
如果文件很小,read()一次性讀取最方便;如果不能確定文件大小,反復調用read(size)比較保險;如果是配置文件,調用readlines()最方便。
五、寫文件
寫文件
open()函數傳入標識符’w’或者’wb’表示寫文本文件或寫二進制文件:
反復調用write()來寫入文件,但是務必要調用f.close()來關閉文件。寫文件時,操作系統往往不會立刻把數據寫入磁盤,而是放到內存緩存起來,空閑的時候再慢慢寫入。只有調用close()方法時,操作系統才保證把沒有寫入的數據全部寫入磁盤。忘記調用close()的后果是數據可能只寫了一部分到磁盤,剩下的丟失了。所以,還是用with語句來得保險:
要寫入特定編碼的文本文件,請給open()函數傳入encoding參數,將字符串自動轉換成指定編碼
字符編碼
要讀取非UTF-8編碼的文本文件,需要給open()函數傳入encoding參數,例如,讀取GBK編碼的文件:
遇到有些編碼不規范的文件,你可能會遇到UnicodeDecodeError,因為在文本文件中可能夾雜了一些非法編碼的字符。遇到這種情況,open()函數還接收一個errors參數,表示如果遇到編碼錯誤后如何處理。
最簡單的方式是直接忽略:
二進制文件
前面講的默認都是讀取文本文件,並且是UTF-8編碼的文本文件。要讀取二進制文件,比如圖片、視頻等等,用’rb’模式打開文件即可: