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

 

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 in old_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 = 0
for i in old_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 in replace_index:
        old_content2[i][1] = new_data

    # 5. 新內容字符串拼接
    str_data = ""
    for i in old_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()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM