天天看點

python 檔案讀寫 a+_python檔案讀寫操作(r/r+/rb/w/w+/wb/a/a+/ab)

一、常用

‘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' "就會報錯。

python 檔案讀寫 a+_python檔案讀寫操作(r/r+/rb/w/w+/wb/a/a+/ab)

Model 2: r+ ---可讀可寫模式

python 檔案讀寫 a+_python檔案讀寫操作(r/r+/rb/w/w+/wb/a/a+/ab)

Model 3: rb ---以二進制方式讀取檔案

python 檔案讀寫 a+_python檔案讀寫操作(r/r+/rb/w/w+/wb/a/a+/ab)

Model 4: w ---隻寫模式

Model 5: w+ ---寫讀模式

Model 6: wb+ ---以二進制方式讀寫檔案

Model 7: a ---追加寫模式

python 檔案讀寫 a+_python檔案讀寫操作(r/r+/rb/w/w+/wb/a/a+/ab)

Model 8: a+ ---追加讀寫模式

python 檔案讀寫 a+_python檔案讀寫操作(r/r+/rb/w/w+/wb/a/a+/ab)

三、拓展

以下是檔案操作中常用的一些方法:

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()