一、常用
‘r’:隻讀。該檔案必須已存在。
‘r+’:可讀可寫。該檔案必須已存在,寫為追加在檔案内容末尾。
‘rb’:表示以二進制方式讀取檔案。該檔案必須已存在。
‘w’:隻寫。打開即預設建立一個新檔案,如果檔案已存在,則覆寫寫(即檔案内原始資料會被新寫入的資料清空覆寫)。
‘w+’:寫讀。打開建立新檔案并寫入資料,如果檔案已存在,則覆寫寫。
‘wb’:表示以二進制寫方式打開,隻能寫檔案, 如果檔案不存在,建立該檔案;如果檔案已存在,則覆寫寫。
‘a’:追加寫。若打開的是已有檔案則直接對已有檔案操作,若打開檔案不存在則建立新檔案,隻能執行寫(追加在後面),不能讀。
‘a+’:追加讀寫。打開檔案方式與寫入方式和'a'一樣,但是可以讀。需注意的是你若剛用‘a+’打開一個檔案,一般不能直接讀取,因為此時光标已經是檔案末尾,除非你把光标移動到初始位置或任意非末尾的位置。(可使用seek() 方法解決這個問題,詳細請見下文Model 8 示例)
看完上面各個模式的釋義,可能有的人會覺得一堆文字有些枯燥,我一開始也是覺得如此,but,看似那麼多模式,無非是三大類:讀r(read),寫w(write),追加a(append)。
當然,我會用盡可能精短的代碼為大家解釋,檔案操作各個模式具體如何使用。請繼續往下看。
二、demo
Model 1: r ---隻讀模式
注意:test2.txt 必須檔案是已存在的。順便說一下字元編碼。因為Windows作業系統預設字元編碼為GBK,而Python預設Unicode.utf-8,如果不寫“ encoding=‘utf-8' "就會報錯。

Model 2: r+ ---可讀可寫模式
Model 3: rb ---以二進制方式讀取檔案
Model 4: w ---隻寫模式
Model 5: w+ ---寫讀模式
Model 6: wb+ ---以二進制方式讀寫檔案
Model 7: a ---追加寫模式
Model 8: a+ ---追加讀寫模式
三、拓展
以下是檔案操作中常用的一些方法:
print(f.readline()) # 列印一行
print(f.readline(5)) # 列印前5個字元
print(f.tell()) # 列印目前指針位置
print(f.read()) # 讀完檔案後,指針在最尾處
f.seek(0) # 如要重頭到尾再讀,檔案指針須先回到檔案頭(0-檔案頭,預設值; 1-目前位置; 2-檔案尾)
print(f.read()) # 重讀檔案
print(f.encoding) # 列印目前使用的字元編碼
print(f.name) # 列印檔案名
print(f.flush()) # 重新整理
f.truncate() # 清空檔案
f.truncate(12) # 從頭開始,第12個字元後截斷并清除
f.close() # 關閉檔案
四、補充一個面試題:
題目:文本檔案id-name.txt中以如下格式儲存了學号和姓名資訊,其中學号是唯一的,不會重複,學号的順序無所謂。
123,yang
1234,dong
……
現在來了一名新生,學号為654321,姓名為王五,請用python代碼添加把新學生添加進txt檔案名單。
如果該學生已經存在,則用“王五”代替目前學号的姓名,學生人數不多,不用考慮代碼的執行效率。
個人追加問題:如果考慮代碼執行效率?該怎麼設計?
附加本人半成品代碼:沒有考慮優化
#1. 讀取檔案内容
with open("./tihuan.txt", "r") as f:
f_r=f.read()
old_content= f_r.split("\n")
old_content2= [item.split(",") for item inold_content]#2. 擷取新内容,将新内容切割得到id和date
new_content = input("請輸入新内容:")
new_id= new_content.split(",")[0]
new_data= new_content.split(",")[1]#3.判斷是否和檔案中内容的ID重複,記錄重複ID在old_content2的下表索引值 添加到清單中, 計算重複總數count
replace_index =[]
count=0for i inold_content2:if len(replace_index) <=len(old_content2):if new_id ==i[0]:
replace_index.append(count)
count+=1
#4. 根據記錄的重複索引下表清單長度 判斷是 執行替換還是 追加操作
if len(replace_index) ==0:print("沒有重複内容,将新内容追加到檔案末尾")
with open("./tihuan.txt", "a") as f_a:
f_a.write(new_content)
f_a.close()else:print("檔案中有{}個相同内容".format(len(replace_index)))for i inreplace_index:
old_content2[i][1] =new_data#5. 新内容字元串拼接
str_data = ""
for i inold_content2:
str_data+= i[0] + "," + i[1] + "\n"
#6. 将新内容寫入檔案
with open("./tihuan.txt", "w") as f_w:
f_w.write(str_data)
f_w.close()