讀:
-
r
/ w:讀 / 寫文本文件; -
rb
/wb
:讀 / 寫二進(jìn)制文件倚舀,圖片辖试、視頻等;
文本文件
with open('/path/to/file', 'r') as f:
print(f.read())
調(diào)用 read()
會一次性讀取全部內(nèi)容驮宴,如果有10G,內(nèi)存就爆了。為保險起見夕土,可以反復(fù)調(diào)用 read(size)
方法,每次最多讀取 size
個字節(jié)的內(nèi)容瘟判。另外怨绣,調(diào)用 readline()
可以每次讀取一行內(nèi)容,調(diào)用 readlines()
一次讀取所有內(nèi)容并按行返回 list
拷获。
如果文件很小篮撑,read()
一次性讀取最方便;如果不能確定文件大小匆瓜,反復(fù)調(diào)用 read(size)
比較保險赢笨;如果是配置文件,調(diào)用 readlines()
最方便:
for line in f.readlines():
print(line.strip()) # 把末尾的'\n'刪掉
二進(jìn)制文件
前面講的默認(rèn)都是讀取文本文件驮吱,并且是 UTF-8
編碼的文本文件茧妒。要讀取二進(jìn)制文件,比如圖片左冬、視頻等等桐筏,用 'rb'
模式打開文件即可:
>>> f = open('/Users/michael/test.jpg', 'rb')
>>> f.read()
b'\xff\xd8\xff\xe1\x00\x18Exif\x00\x00...' # 十六進(jìn)制表示的字節(jié)
字符編碼
要讀取非 UTF-8
編碼的文本文件,需要給 open()
函數(shù)傳入 encoding
參數(shù)拇砰,例如九昧,讀取 GBK
編碼的文件:
>>> f = open('/Users/michael/gbk.txt', 'r', encoding='gbk')
>>> f.read()
'測試'
遇到有些編碼不規(guī)范的文件,你可能會遇到UnicodeDecodeError
毕匀,因為在文本文件中可能夾雜了一些非法編碼的字符铸鹰。遇到這種情況,open()
函數(shù)還接收一個errors
參數(shù)皂岔,表示如果遇到編碼錯誤后如何處理蹋笼。最簡單的方式是直接忽略:
f = open('/Users/michael/gbk.txt', 'r', encoding='gbk', errors='ignore')
寫文件
寫文件和讀文件是一樣的,唯一區(qū)別是調(diào)用 open()
函數(shù)時,傳入標(biāo)識符 'w'
或者 'wb'
表示寫文本文件或?qū)懚M(jìn)制文件:
可以反復(fù)調(diào)用 write()
來寫入文件剖毯;
with open('/Users/michael/test.txt', 'w') as f:
f.write('Hello, world!')
要寫入特定編碼的文本文件圾笨,給 open()
函數(shù)傳入 encoding
參數(shù),將字符串自動轉(zhuǎn)換成指定編碼逊谋。
以 'w'
模式寫入文件時擂达,如果文件已存在,會直接覆蓋(相當(dāng)于刪掉后新寫入一個文件)胶滋。如果我們希望追加到文件末尾怎么辦板鬓?可以傳入'a'
以追加(append
)模式寫入。