python 操作文件的常用方式有如下
讀文件:r 模式
實例演示1:
f1 = open(file='D:\Python3.5-learn\模塊2\character3_文件操作\staff_table.txt',mode='r',encoding='utf-8') # 以 r 的 模式,打開指定路徑的文件 ,按照utf-8 的方式去讀取
data = f.read() # 讀取文件,表示讀取所有內容
f.close() # 關閉文件
實例演示2:
f2 = open(file='D:\Python3.5-learn\模塊2\character3_文件操作\staff_table.txt',mode='rb',encoding='utf-8') # 以 rb 二進制 的 模式,打開指定路徑的文件 ,按照utf-8 的方式去讀取
data = f.read() # 讀取文件,表示讀取所有內容
f2.close() # 關閉文件
示例2和示例1的區別在哪?
答:在於示例2打開文件時並未指定encoding,這是爲何?是因爲直接以rb模式打開了文件 ,rb是指二進制模式,數據讀到內存裏直接是bytes格式,如果想內容,還需要手動decode,因此在文件打開階段,不需要指定編碼
循環遍歷文件:
f = open(file='D:\Python3.5-learn\模塊2\character3_文件操作\staff_table.txt',mode='r',encoding='utf-8') #
for line in f:
print(line)
f.close()
寫文件:w 模式
實例演示1:
f1 = open(file='D:\Python3.5-learn\模塊2\character3_文件操作\staff_table.txt',mode='w',encoding='utf-8') # 以 w 的 模式,打開指定路徑的文件 ,按照utf-8 的方式去寫
data = f.write(“.....”) # 寫入指定的文件
f.close() # 關閉文件
實例演示2:
f2 = open(file='D:\Python3.5-learn\模塊2\character3_文件操作\staff_table.txt',mode='rb',encoding='utf-8') # 以 wb 二進制 的 模式,打開指定路徑的文件 ,按照utf-8 的方式去讀取
data = f.write(“.....”) # 寫入指定的文件
f2.close() # 關閉文件
提示:文件以w 或者 wb 的方式去操作的時候,會清空原有的文件,
wb,寫入時需要直接傳入以某種編碼的0100101,即:字節類型
w 和 encoding,寫入時需要傳入unicode字符串,內部會根據encoding制定的編碼將unicode字符串轉換爲該編碼的 010101010
追加文件:a模式
f1 = open(file='D:\Python3.5-learn\模塊2\character3_文件操作\staff_table.txt',mode='a',encoding='utf-8') # 以 w 的 模式,打開指定路徑的文件 ,按照utf-8 的方式去寫
data = f.write(“\n11,Kevin Chen,22,13151054603,Sales,2013-04-01”) # 寫入指定的文件
f1.close() # 關閉文件
文件操作時,以 “a”或“ab” 模式打開,則只能追加,即:在原來內容的尾部追加內容
寫入到硬盤上時,必須是某種編碼的0101010,打開時需要注意:
ab,寫入時需要直接傳入以某種編碼的0100101,即:字節類型
a 和 encoding,寫入時需要傳入unicode字符串,內部會根據encoding制定的編碼將unicode字符串轉換爲該編碼的 010101010
讀寫模式:r+
f1 = open("beiying2.txt", "r+",encoding="utf-8") # 以讀寫的方式打開文件
data = f1.read() # 讀取文件
print(data)
f1.write("\n first line") # 在文件的末尾追加文件
f1.close() # 關閉文件
寫讀模式:w+
f1 = open("beiying.txt", "w+", encoding="utf-8")
data = f1.read()
print(data)
f1.write("line 1")
f1.write("\nline 2")
f1.write("\nline 3")
f1.write("\nline 4")
f1.close()
w+會先把文件清空,再寫新內容,相比w模式,只是支持了一個讀功能,且還只能讀已經寫入的新內容
文件操作的其他方式:
def flush(self, *args, **kwargs): # real signature unknown
把文件從內存buffer裏強制刷新到硬盤
def seek(self, *args, *kwargs): # real signature unknown
把操作文件的光標移到指定位置
注意seek的長度是按字節算的, 字符編碼存每個字符所佔的字節長度不一樣。
如“路飛學城” 用gbk存是2個字節一個字,用utf-8就是3個字節,因此以gbk打開時,seek(4) 就把光標切換到了“飛”和“學”兩個字中間。
但如果是utf8,seek(4)會導致,拿到了飛這個字的一部分字節,打印的話會報錯,因爲處理剩下的文本時發現用utf8處理不了了,因爲編碼對不上了。少了一個字節
def tell(self, *args, **kwargs): # real signature unknown
返回當前文件操作光標位置
def truncate(self, *args, *kwargs): # real signature unknown
按指定長度截斷文件
指定長度的話,就從文件開頭開始截斷指定長度,不指定長度的話,就從當前位置到文件尾部的內容全去掉。