python
在寫python 代碼的過程,我發現在讀寫文件的過程中有的時候會出現點問題,所以還是想花點時間總結一下,加深一下自己的印象。
讀文件
python 中可以用 內置的open()函數來打開一個文件。源碼中是這樣定義的
open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)
一般情況向,只需要考慮前面兩個參數,也就是 file 和 mode,file 代表的是文件路徑,mode指的是打開方式,默認是讀方式打開,具體如下表:
mode | annotation |
---|---|
‘r’ | 以讀方式打開 |
‘w’ | 以寫方式打開 |
‘a’ | 以追加模式打開 |
‘x’ | 新建一個文件,且以寫方式打開 |
‘b’ | 二進制模式 |
‘t’ | text 模式,也就是打開的結果是 str類型的,默認的 |
‘+’ | (打開磁盤文件更新) 讀寫模式 |
示例(介紹比較常用的):
- 以讀方式打開文件
#【英文】
#第一種
file = open('/Users/lionel/Downloads/english.txt')
#第二種
file = open('/Users/lionel/Downloads/english.txt','r')
#【中文】
file = open('/Users/lionel/Downloads/Chinese.txt', 'r')
print(file)#控制檯無顯示,需要以二進制打開,下節會講
- 以二進制形式打開
#【英文】
# 以二進制讀出,和以讀方式讀出區別在於開始處多一個 b 字符,標示着是二進制
file = open('/Users/lionel/Downloads/english.txt','rb')
#【中文】
file = open('/Users/lionel/Downloads/Chinese.txt','rb')
中文以二進制打開的結果是:
b'\xe6\xa2\x85\xe8\xa5\xbf\xe6\x98\xaf\xe4\xbd\x8d\xe4\xbc\x9f\xe5\xa4\xa7\xe7\x9a\x84\xe8\xb6\xb3\xe7\x90\x83\xe8\xbf\x90\xe5\x8a\xa8\xe5\x91\x98\n'
想要表示爲中文
file.read().decode('utf-8')
結果是:
梅西是位偉大的足球運動員
- 讀一行文件
前面調用read()方法可以一次性讀取所有內容,可以使用readline()一行一行地讀取。
file = open('/Users/lionel/Downloads/Chinese.txt','rb')
file.readline().decode('utf-8')
注意:
- 文件打開後,使用 close() 完畢後必須關閉,因爲文件對象會佔用操作系統的資源,並且操作系統同一時間能打開的文件數量也是有限的。
- 由於文件讀寫時都有可能產生IOError,一旦出錯,後面的f.close()就不會調用。所以,爲了保證無論是否出錯都能正確地關閉文件,我們可以使用try … finally來實現。
try:
file = open('/Users/lionel/Downloads/Chinese.txt','rb')
print(file.read().decode('utf-8'))
finally:
if file:
file.close()
- 但是每次都這麼寫實在太繁瑣,所以,Python引入了with語句來自動幫我們調用close()方法:
with open('/Users/lionel/Downloads/Chinese.txt', 'rb') as file:
print(file.read().decode('utf-8'))
寫文件
寫文件其實個讀文件是類似的,唯一的區別在於調用的 python 的內置函數 open()函數,傳入標識符’w’或者’wb’表示寫文本文件或寫二進制文件。然後調用 write ()向文件中寫入內容。當我們寫文件時,操作系統往往不會立刻把數據寫入磁盤,而是放到內存緩存起來,空閒的時候再慢慢寫入。只有調用close()方法時,操作系統才保證把沒有寫入的數據全部寫入磁盤。
output = open('output', 'wb')
output.write(text)
由於寫文件和讀文件類似,在這裏面就不詳細介紹了,有興趣的可以自己去了解。同樣記住要執行 close()方法,建議直接使用 with 語句。
參考文件:python文件讀寫