文件的操作包含:讀、寫、修改 文件的多種操作: 1 # 讀取文件的所有內容 2 data = open("yesteday.txt", encoding="utf-8") .read() 3 print(data) 4 5 ''' f:文件句柄(包含這個文件的文件名,字元集,大小,在硬碟中的起始位置 ...
文件的操作包含:讀、寫、修改
文件的多種操作:
1 # 讀取文件的所有內容 2 data = open("yesteday.txt", encoding="utf-8") .read() 3 print(data) 4 5 ''' f:文件句柄(包含這個文件的文件名,字元集,大小,在硬碟中的起始位置) ''' 6 7 # 'a'=append 追加 8 f = open("yesteday2.txt", 'a', encoding="utf-8") 9 f.write("qwerQWER1111\n") #在文件的結尾添加內容 10 f.close() 11 12 # 'w'=write 寫,覆蓋之前的內容 13 f = open("yesteday2.txt", 'w', encoding="utf-8") 14 f.write("AAAADDDDD\n") 15 f.write("CCCCVVVVV\n") 16 f.close() 17 18 #'r'=read 只讀 19 f = open("yesteday2.txt", 'r', encoding="utf-8") 20 print(f.read()) 21 f.close() 22 23 # 'r+' = r+a 讀和在末尾追加 24 f = open("yesteday.txt", 'r+', encoding='utf-8') 25 print(f.readline()) 26 print(f.tell()) 27 f.write("---nihao---\n") 28 print(f.readline()) #無輸出結果是因為r+寫操作是寫在末尾,所以游標到了末尾,讀不出來東西了 29 print(f.tell()) #tell按字元計數,返回游標的位置 30 f.seek(0) #返回到某個位置 31 print(f.read()) 32 f.close() 33 34 # 'w+' = w+r 寫和讀,寫還是只能追加在文件最後 35 f = open("yesteday.txt", 'w+', encoding='utf-8') 36 print(f.readline()) #讀不到內容,因為w+會新創建一個文件,將原文件的內容清空 37 f.write("---nihao---\n") #寫操作是寫在末尾,所以游標到了末尾,讀不出來東西了 38 f.write("---oh,god---\n") 39 print(f.tell()) 40 f.seek(3) 41 print(f.tell()) 42 print(f.readline()) #當游標不在一行的開頭時,readline讀取的內容為游標之後的部分 43 print(f.tell()) 44 f.write("寫在第一行後面") #寫操作是寫在末尾,即使通過調整游標的位置,也無法將這行寫到第一行後面 45 print(f.tell()) 46 f.seek(0) 47 print(f.read()) 48 f.close() 49 50 # 'a+'追加讀 51 f = open("yesteday.txt", 'a+', encoding='utf-8') 52 print(f.read()) #讀不出內容來,因為a+預設游標在結尾 53 f.write("---nihao---\n") 54 print(f.tell()) #tell按字元計數,返回游標的位置 55 f.seek(0) #返回到某個位置 56 print(f.read()) 57 f.close() 58 59 # 'rb' = 以二進位格式讀文件 60 f = open("yesteday.txt", 'rb') #不能加encoding的格式 61 print(f.read()) 62 f.seek(0) #返回到某個位置 63 print(f.read()) 64 f.seek(0) #返回到某個位置 65 print(f.read()) 66 f.seek(0) #返回到某個位置 67 print(f.readline()) #readline讀一行 68 f.close() 69 70 # 'wb' = 以二進位格式寫文件,會清空原文件內容 71 f = open("yesteday.txt", 'wb') #使用wb時寫時需要將字元串變為二進位格式 72 f.write("hello binary\n".encode()) #將hello binary變為二進位格式後寫入文件 73 f.write("hello binary\n".encode()) 74 f.close() 75 76 # 'ab' = 以二進位格式追加寫文件 77 f = open("yesteday.txt", 'ab') 78 f.write("hello binary\n".encode()) 79 f.close()
有關文件的其他方法:
1 # f = open("yesteday2.txt", 'a+', encoding="utf-8") 2 # print(f.tell()) #游標在文件最後 3 # print(f.read(5)) #讀取不到內容 4 # print(f.tell()) #tell按字元計數 5 # f.seek(3) #返回到某個位置 6 # print(f.readline()) #當seek回到某行的中間時,下次讀取一行時將cut掉前面的部分,讀取後面的 7 # f.seek(3) 8 # print(f.tell()) #獲取文件讀取到的位置 9 # print(f.encoding) #返迴文件句柄的編碼格式 10 # print(f.fileno()) #返回編號--操作系統介面 11 # print(f.seekable()) #是否可以將游標移動回去,能返回True 12 # print(f.readable()) #判斷文件是否可讀 13 # print(f.writable()) #判斷文件是否可寫 14 # f.write("1111222333\n") 15 # f.write("1111222333\n") #寫操作會先存在記憶體緩存區,不是直接寫到硬碟,當緩存區達到一個數值時,同時寫到硬碟里 16 # f.flush() # 強制刷新--將緩存區的內容寫到硬碟 17 # f.truncate(10) #截斷 ,從指定的位置截斷後面的部分,如果不寫預設從頭開始截斷,即清空,seek移動游標沒 18 # f.close() #關閉打開的文件 19 # print(f.closed) #判斷是否關閉了
有關文件讀的示例:
1 # 讀五行 2 f = open("yesteday2.txt", 'r', encoding="utf-8") 3 for i in range(5): 4 data = f.readline() 5 print(data) 6 f.close() 7 8 # 讀5個字元 9 f = open("yesteday2.txt") 10 print(f.tell()) 11 print(f.read(5)) 12 f.close() 13 14 # 列印除了第三行的其他內容 15 # enumerate() 函數用於將一個可遍歷的數據對象(如列表、元組或字元串)組合為一個索引序列,同時列出數據和數據下標,一般用在 for 迴圈當中 16 f = open("yesteday2.txt", 'r', encoding="utf-8") 17 for index,line in enumerate(f.readlines()): 18 if index == 3: 19 print("------") 20 continue 21 print(line.strip()) # strip() 方法用於移除字元串頭尾指定的字元(預設為空格或換行符)或字元序列 22 f.close() 23 24 # 效率最高,讀一行往記憶體裡加一行,讀下一行會把記憶體里的上一行覆蓋掉 25 f = open("yesteday2.txt", 'r', encoding="utf-8") 26 count = 0 27 for line in f: 28 if count == 3: 29 count += 1 30 print("----------3-----------") 31 continue 32 print(line) 33 count += 1 34 f.close()
通過上面的放法,實際並不能完成文件的修改,因為寫入文件總是寫在文件最後或覆蓋掉源文件
通過以下方式可修改文件內容:
>>> testfile.txt
就像一部電影原諒慘敗的票房
我走在街上悶著頭游蕩把心事流放
關掉電話卸下行囊席地坐路旁
一如乞人不需要形象
萬家燈火帶領星光拼出個晚上
絢爛的欲望涌進了街巷每個虛弱地方
廣場音箱兀自播放某個排行榜
上榜的歌像背景一樣
那不是歌 那是孤單的歌
這白馬非馬的邏輯鮮有附和
唱著什麼 故事里多少曲折
熙來攘往中幾人識得幾人識得
那不是歌 那是我寫的歌
當時的我喜或悲已經記不得
南轅北轍 破壞熱鬧氣氛的歌
幾人識得幾人識得
被人慌慌張張按掉了
1 f = open("testfile", "r", encoding="utf-8") 2 f_new = open("testfile2", "w", encoding="utf-8") 3 4 for line in f: 5 if "幾人識得" in line: 6 # '1'代表這一行只修改匹配的第一處 7 line = line.replace("幾人識得", "誰(shui)人識得", 1) 8 f_new.write(line) 9 f.close() 10 f_new.close()
為了防止進行完文件操作後,忘記關閉文件,可以使用with語法:
1 #為了避免打開文件後忘記關閉,可以通過管理上下文,即 2 with open("testfile", "r", encoding="utf-8") as f: 3 for line in f: 4 print(line) 5 6 #如此方式,當with代碼塊執行完畢時,內部會自動關閉 並釋放資源 7 #在py2.7後,with又支持同時對多個文件的上下文進行管理,即 8 with open("testfile", "r", encoding="utf-8") as f1,\ 9 open("testfile2", "w", encoding="utf-8") as f2: 10 print(f1.readline()) 11 f2.writable()