python學習之七(檔案的操作)
阿新 • • 發佈:2018-12-16
檔案的操作要注意路徑的問題,這裡用的都是相對路徑。
# 檔案操作 r:寫模式,w:讀模式,建立新文件覆蓋原來的文件 # f=open('a.txt','r',encoding='utf-8') # # data=f.read() # # print(data) # # 可讀檔案,預設是可讀檔案,readline是讀檔案第幾行 # print(f.readable()) # print('第一行:',f.readline(),end='') # end=''表示取消換行 # print('第二行:',f.readlines()) # f=open('b','w',encoding='utf-8') # f.write('111111111111\n') # f.write('2222222222222\n') # f.writelines(['第五行\n','第六行\n']) # 以列表的形式寫入檔案 # f.close() # 追加模式,一般在日誌檔案用的多 # f=open('b','a',encoding='utf-8') # f.write('寫到檔案最後') # f.close() # 讀寫模式 寫的時候只從游標的位置往後寫 # f=open('b','r+',encoding='utf-8') # print(f.read()) # f.write('離離原上草') # print(f.read()) # 只往新檔案裡寫一行 # src_f=open('b','r',encoding='utf-8') # data=src_f.readlines() # src_f.close() # dst_f=open('b_new','w',encoding='utf-8') # dst_f.write(data[0]) # dst_f.close() # 使用with可以不用close語句 # with open('b','w') as f: # f.write('1111\n') # with open('a.txt','r',encoding='utf-8') as src_f,\ # open('b','r',encoding='utf-8') as dst_f: # print(src_f.read()) # print(dst_f.read()) # 以位元組方式操作檔案 後面不需要編碼方式 # f=open('a.txt','rb') # data=f.read() # print(data) # # 沒有編碼方式還想看到內容進行解碼 # print(data.decode('utf-8')) # 寫位元組檔案時,要對字串進行編碼 # f=open('a_new','wb') # f.write(bytes('11111111\n',encoding='utf-8')) # f.write('小狗'.encode('utf-8')) # f=open('b','r+',encoding='latin-1') # data=f.read() # print(data) # python會在最後加一個/r,用newline來讀取檔案換行符號 seek用來控制游標的移動 # f=open('a.txt','r+',encoding='utf-8',newline='') # print(f.readline()) # print(f.tell()) # # 把游標往後移動三個位元組 # f.seek(3) # print(f.tell()) # # 從游標往後的四個字元 # print(f.read(4)) # 使用f.truncate(10)來擷取檔案,擷取的是位元組,不是字元 # seek方法的使用,最好用b的方式開啟檔案 # f = open('a.txt','rb') # print(f.tell()) # # 2代表倒敘seek,倒敘seek10個字元,對於處理日誌檔案經常用 # f.seek(-15,2) # print(f.read()) # print(f.tell()) # # seek是從開頭部分開始的 # f.seek(3) # print(f.tell()) # # seek還能設定從哪開始到哪結束 # f.seek(3,1) # print(f.tell()) # 迴圈檔案內容,一次只迴圈一行
f=open('日誌檔案','rb') for i in f: print(i)
在實際的應用程式開發過程中,日誌檔案的資料量可能會特變大,如果還是從頭開始會導致讀取時間過長,所以只能從檔案的最末端往前讀,我們往往想讀取的是日誌檔案的最後幾行操作,那麼如何獲取日誌檔案最後一行操作呢:
f=open('日誌檔案','rb') for i in f: # 定義一次的偏移量 offs=-50 while True: f.seek(offs,2) data=f.readlines() if len(data) > 1: # data[-1]:取出最後一行 print('檔案的最後一行是%s' %(data[-1].decode('utf-8'))) break offs*=2
在迴圈體中,定義一次的偏移量,這裡的偏移量是指位元組,f.seek(offs,2)表明從檔案的末尾開始迴圈,data取出一次偏移量所讀取的行數,如果讀取的行數大於1行,則取出最後一行,並用utf-8編碼格式進行解碼,並且終止迴圈;如果一次偏移量所讀取的行數不大於1行,則增加偏移量offs*=2,繼續迴圈讀取,直到行數大於1行為止。檔案內容如下所示:
輸出結果: