1. 程式人生 > >python學習之七(檔案的操作)

python學習之七(檔案的操作)

檔案的操作要注意路徑的問題,這裡用的都是相對路徑。

# 檔案操作 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行為止。檔案內容如下所示:

輸出結果: