Python3_檔案操作方法
一、使用Python開啟檔案的方法
使用Python開啟檔案時需要注意目標檔案的路徑和檔案的編碼方式,若沒有指定路徑和編碼方式預設使用的是相對路徑和系統預設的編碼方式
open()方法
f = open("test", encoding="utf-8") data = f.read() print(data)
opne()方法預設使用r模式對檔案進行開啟
使用open()方法對檔案進行操作結束的時候必須要將其從記憶體中進行回收,否則會佔用記憶體
回收方法:
f.close()
with方法:
和open()方法不同,使用with方法開啟檔案對檔案進行操作結束的時候可以不用手動回收開啟檔案
使用方法:
with open("test", encoding="utf-8") as f: data = f.read() print(data)
with方法還可以同時開啟多個檔案,如:
with open("test1", encoding="utf-8") as f1, open("test2", encoding="utf-8") as f2: data1 = f1.read() data2 = f2.read() print(data1) print(data2)
二、關於r模式下的方法
1、使用r模式開啟檔案
Python預設使用r模式開啟檔案,不需要特殊指定
with open("test", encoding="utf-8") as f: data = f.read() print(data)
執行結果:
1
2
3
4
5
2、關於讀的操作方法
with open("test", encoding="utf-8") as f: # 讀取整個檔案內容 data1 = f.read() print("data1的內容是:", data1) # 判斷開啟的檔案是否是可讀 data2 = f.readable() print("data2的內容是:", data2) # 每次只讀取檔案的一行 data3 = f.readline() print("data3的內容是:", data3) # 將檔案的每一行內容讀取出來放到一個列表中 data4 = f.readlines() print("data4的內容是:", data4)
執行結果:
data1的內容是: 1 2 3 4 5 data2的內容是: True data3的內容是: data4的內容是: []
可以發現data3和data4的內容為空,這是因為對檔案進行讀操作的時候都是從當前遊標所在的位置進行讀取,若遊標在檔案的末尾的時候在進行讀操作的話並不會讀取到內容
with open("test", encoding="utf-8") as f: # 讀取整個檔案內容 # data1 = f.read() # print("data1的內容是:", data1) # 判斷開啟的檔案是否是可讀 data2 = f.readable() print("data2的內容是:", data2) # 每次只讀取檔案的一行 data3 = f.readline() print("data3的內容是:", data3) # 將檔案的每一行內容讀取出來放到一個列表中 data4 = f.readlines() print("data4的內容是:", data4)
data2的內容是: True data3的內容是: 1 data4的內容是: ['2\n', '3\n', '4\n', '5']
三、關於w模式下的方法:
1、使用w模式開啟檔案
使用w模式對檔案進行操作的時候,若目標檔案不存在則建立,若目標檔案存在則將目標檔案清空
在對檔案進行寫操作的時候內容必須為字串;當一行結束的時候必須要使用換行符,否則還是在同一行內進行輸入
with open("test", "w", encoding="utf-8") as f: data1 = f.write()
2、關於寫的操作方法
使用w模式對檔案進行操作:
為了測試方便建立了一個新的空檔案new_test
with open("new_test", "w", encoding="utf-8") as f: # 將相應的內容寫到目標檔案中 f.write("這是第1行\n這是第2行\n這是第3行\n") # 判斷檔案是否可寫 data1 = f.writable() print("data1的內容是:", data1) # 將列表中的每個元素都寫入到目標檔案中 f.writelines(["這是第4行\n", "這是第5行\n", "這是第6行\n"])
執行結果:
data1的內容是: True
檔案new_test的內容:
這是第1行 這是第2行 這是第3行 這是第4行 這是第5行 這是第6行
四、關於a模式下的方法:
1、使用a模式開啟檔案
with open("test", "a", encoding="utf-8") as f: data1 = f.write()
2、關於追加的操作方法
追加操作和寫操作相同,不同的是追加操作是在檔案末尾進行寫
with open("new_test", "a", encoding="utf-8") as f: f.write("這是第7行") data1 = f.writable() print("data1的內容是:", data1) f.writelines(["這是第8行\n", "這是第9行\n", "這是第10行\n"])
執行結果:
data1的內容是: True
檔案new_test的內容:
這是第1行 這是第2行 這是第3行 這是第4行 這是第5行 這是第6行 這是第7行這是第8行 這是第9行 這是第10行
五、在對檔案進行修改的時候計算機內的操作
- 1、軟體將硬碟上的二進位制檔案讀取到記憶體中進行解碼,並將解碼得到的結果通過軟體輸出到螢幕
- 2、使用軟體在記憶體中對檔案進行修改
- 3、修改完後將檔案以二進位制格式覆蓋原檔案在硬碟中的二進位制
六、以位元組方式對檔案進行操作
1、rb
開啟檔案的方法:
open("test", "rb")
當使用位元組方式對檔案進行操作的時候無需指定編碼
讀取方式:
在使用位元組的情況下需要讀取檔案內容的時候要將位元組轉化為字串後進行輸出,否則會以位元組形式進行輸出。
with open("new_test", "rb") as f: data = f.read() print(data.decode("utf-8"))
執行結果:
這是第1行 這是第2行 這是第3行 這是第4行 這是第5行 這是第6行 這是第7行這是第8行 這是第9行 這是第10行
2、wb
開啟檔案的方法:
open("new_test", "wb")
寫入方式:在使用位元組對檔案進行寫操作的時候需要將字串轉換為位元組後進行輸入
with open("new_test", "wb") as f: data = "這是第11行\n".encode("utf-8") f.write(data)
new_test的檔案內容:
這是第11行
3、ab
開啟檔案的方法:
open("new_test", "ab")
寫入方式:和wb的方式一樣
with open("new_test", "ab") as f: data = "這是第12行\n".encode("utf-8") f.write(data)
new_test的檔案內容:
這是第11行 這是第12行
七、檔案操作的其他方法:
1、flush():將檔案在記憶體中的內容存放到硬碟中
使用方法:
f.flush()
2、tell():檢視當前游標所在的位置(以位元組為單位)
使用方法:
print(f.tell())
3、seek():移動游標(以位元組為單位)
使用方法:
with open("new_test", "ab") as f: f.seek(10)# 將游標從檔案開始處向後移動10個位元組 print(f.tell()) f.seek(10,1)# 將游標相對於前面的游標所在的位置處向後移動10個位元組 print(f.tell()) f.seek(-10,2)# 將游標從檔案末尾處向前移動10個位元組
執行結果:
10
20
seek(num,2)可用來獲取日誌的最後一行,程式碼如下:
測試檔案test檔案內容
這是第1行 這是第2行 這是第3行 這是第4行 這是第5行 這是第6行 這是第7行 這是第8行 這是第9行 這是第10行 這是第11行 這是第12行 這是第13行 這是第14行
獲取測試檔案test的最後一行
with open("test", "rb") as f: # 遍歷檔案 for i in f: # 指定一個seek的初始值 init = -10 while True: f.seek(init, 2) data_list = f.readlines() # 判斷從游標所在的位置往後讀取,是否超過一行 if len(data_list) > 1: print(data_list[-1].decode("utf-8")) break else: init *= 2
執行結果
這是第14行