Python-18-函數_07_文件處理
阿新 • • 發佈:2018-11-29
table 清空 閱讀 一行 進制 我們 開頭 格式 刷新
文件處理流程:
1、打開文件,得到文件句柄並賦值給一個變量
2、通過句柄對文件進行操作
3、關閉文件
# Example 1 # f = open(‘a‘,encoding=‘utf-8‘) # 打開文件,得到文件句柄並賦值給一個變量 # data = f.read() # 通過句柄對文件進行操作 # print(data) # f.close() # 關閉文件
##################### 打開文件的模式 ##################
默認為文本模式,只能是字符串(文件沒有修改一說,全是覆蓋!!)
r -- 只讀模式【默認模式;文件必須存在,不存在則拋出異常】
w -- 只寫模式【不可讀;不存在則創建;存在則清空內容】
a -- 只追加寫模式【不可讀;不存在則創建;存在則只追加內容】
x -- 只寫模式【不可讀;不存在則創建;存在則報錯】(不常用,沒什麽用)
##################### 打開文件的模式 ##################
對於非文本文件,我們只能使用b模式,"b"表示以字節的方式操作(而所有文件也都是以字節的形式存儲的,
使用這種模式無需考慮文本文件的字符編碼、圖片文件的jgp格式、視頻文件的avi格式)
rb wb ab
以b方式打開時,讀取到的內容是字節類型,寫入時也需要提供字節類型,不能指定編碼
##################### 打開文件的模式 ##################
"+" 表示可以同時讀寫某個文件
r+, 讀寫【可讀,可寫】
w+, 寫讀【可讀,可寫】
a+, 寫讀【可讀,可寫】
##################### 打開文件的模式 ##################
# 1、r -- 只讀模式 # f = open(‘a‘,‘r‘,encoding=‘utf-8‘) # 默認打開模式就為 r # data = f.read() # 讀取文件全部,如果這裏讀取了,下面再出現readline 就沒有文件讀取了。 # print(data) # print(f.readable()) # 結果:True 判斷當前文件是否是-只讀(r) # print(f.readline()) # 讀取文件 第一行 (一次讀一行)# print(f.readline(),end="") # 讀取文件 第二行 並且第二行、第三行之間沒有 另隔一行 換行 # print(f.readline()) # 讀取文件 第三行 # data = f.readlines() # 將文件所有行,按列表的形式輸出 # print(data) # f.close() # 2、w -- 只寫模式 # 寫模式--如果文件不存在,新建一個文件;如果文件存在,會把該文件清空(==新建一個空文件,覆蓋原文件) # f = open(‘a1‘,‘w‘,encoding=‘utf-8‘)# f.write("newmet.top == 初相識 01\n") # f.write("newmet.top == 初相識 02\n") # f.write("new\nmet.top\n初相識 03\n") # print(f.writable()) # 結果:True 判斷當前文件是否是-只寫(w) # f.writelines([‘111\n‘,‘222\n‘,‘333\n‘]) # # f.close() # 3、a -- 只追加寫模式 # f = open(‘a1‘,‘a‘,encoding=‘utf-8‘) # f.write("寫到文件最後") # 類似 日誌訪問記錄,自動追加到文件最後 # f.close() # 4、f.close 可以不寫,利用with關鍵字去只寫、只讀文件: # 1)打開一個文件: with open(‘a1‘,‘w‘,encoding=‘utf-8‘) as f: f.write("newmet.top\n初相識\n") # 2)同時打開兩個文件: with open(‘a‘,‘r‘,encoding=‘utf-8‘) as src_f, open(‘a1‘,‘w‘,encoding=‘utf-8‘) as dst_f: # 同一行代碼太長,加\ enter 換行 data = src_f.read() dst_f.write(data)
##################### 文件的修改 ##################
# 1、文件取出來、修改 src_f = open(‘文件修改‘,‘r‘,encoding=‘utf-8‘) data1 = src_f.readlines() # 列表 src_f.close() dst_f = open("文件修改-01","w",encoding="utf-8") # f2.writelines(data1) dst_f.write(data1[0]) dst_f.close() # 2、文件覆蓋 src_f = open(‘文件修改‘,‘r‘,encoding=‘utf-8‘) data1 = src_f.readlines() # 列表 src_f.close() dst_f = open("文件修改","w",encoding="utf-8") # f2.writelines(data1) dst_f.write(data1[0]) dst_f.close() # 上面1、2合並在一起: with open(‘文件修改‘,‘r‘,encoding=‘utf-8‘) as src_f, open(‘文件修改-01‘,‘w‘,encoding=‘utf-8‘) as dst_f: # 同一行代碼太長,加\ enter 換行 data = src_f.read() dst_f.write(data)
##################### b模式 ##################
f = open(‘a1‘,‘rb‘) # b模式不能指定編碼 data = f.read() print(data) # 二進制 print(data.decode(‘utf-8‘)) # 字符串 f.close() f = open(‘a1‘,‘wb‘) # b模式不能指定編碼 f.write(bytes(‘newmet\n‘,encoding=‘utf-8‘)) # 編碼 f.write(‘初相識‘.encode(‘utf-8‘)) # 編碼 f.close() f = open(‘a1‘,‘ab‘) # b模式不能指定編碼 f.write(‘初相識‘.encode(‘utf-8‘)) # 編碼 f.close()
##################### 文件處理的其他方法 ##################
f=open(‘a1‘,‘r+‘,encoding=‘utf-8‘) f.read() #讀取所有內容,光標移動到文件末尾 f.readline() #讀取一行內容,光標移動到第二行首部 f.readlines() #讀取每一行內容,存放於列表中 print(f.encoding) # 輸出 讀取時文件使用的編碼 f.flush() # 刷新 保存 print(f.name) # 打印文件名 f=open(‘a1‘,‘r+‘,encoding=‘utf-8‘,newline=‘‘) # 讀取文件中真正的換行符號(\r\n) # 光標的移動 # 一: read(3): # 1. 文件打開方式為文本模式時,代表讀取3個字符 # 2. 文件打開方式為b模式時,代表讀取3個字節 # 二: 其余的文件內光標移動都是以字節為單位如seek,tell,truncate print(f.tell()) # 定位光標位置 f.readline() print(f.tell()) f.seek(10) print(f.tell()) data=f.truncate(10) # 截取從開始一直到第10個 部分 print(data) ############ seek 0、1、2 ########## # 1、f.seek(3,0) # 0 可寫可不寫,代表從開頭位置算起 f=open(‘seek.txt‘,‘r‘,encoding=‘utf-8‘) print(f.tell()) # 0 f.seek(10) print(f.tell()) # 10 f.seek(3) print(f.tell()) # 3 # 2、f.seek(3,1) # 1 代表相對位置,從上一次光標所在位置算起 # 相對位置,只能是b模式,而且不能有encoding編碼 f=open(‘seek.txt‘,‘rb‘) print(f.tell()) # 0 f.seek(10,1) # 10 print(f.tell()) f.seek(3,1) print(f.tell()) # 13 # 3、f.seek(3,2) # 2 代表相對位置,從末尾光標所在位置算起 # 相對位置,只能是b模式,而且不能有encoding編碼 f=open(‘seek.txt‘,‘rb‘) print(f.tell()) f.seek(-10,2) print(f.read()) # 結果:b‘2\r\nnewmet3‘ ############ seek 0、1、2 ########## # 看日誌最後一行內容: # 1、基礎方法: f=open(‘日誌文件‘,‘rb‘) data=f.readlines() print(data[-1].decode(‘utf-8‘)) # 2、seek方法: # 看日誌最後一行內容: f=open(‘日誌文件‘,‘rb‘) for i in f: # 循環文件的推薦方式 要一行給一行 offs = -3 # 定義一個偏移量 while True: f.seek(offs,2) data=f.readlines() if len(data)>1: print(‘最後一行:%s‘%(data[-1].decode(‘utf-8‘))) break offs*=2 # 倒序閱讀,逐漸增加偏移量
Python-18-函數_07_文件處理