天天看點

python-檔案的基本操作

檔案操作的三個步驟:

1,打開檔案,得到檔案句柄并指派給一個變量

2.通過句柄對檔案進行操作

3.關閉檔案

一、打開關閉檔案

必須先用Python内置的open()函數打開一個檔案,建立一個file對象,相關的方法才可以調用它進行讀寫

f = open('a.txt', mode='rt',encoding='utf-8')      
f.close()      

f.close()是向作業系統發送請求,要求作業系統關閉打開的檔案,檔案打開後,一定要在程式結束前關閉!

with語句:為了防止忘記關閉檔案,Python的上下文管理with語句可以很友善的使用

with open('a.txt', mode='rt', encoding='utf-8') as f:
    pass
# 打開多個檔案
with open('a.txt', mode='rt', encoding='utf-8') as f,open('b.txt', mode='rt', encoding='utf-8')as f1:
    pass          

二、檔案基本操作

  • r:隻讀模式,     預設模式,檔案必須存在不存在則抛出異常
  • w:隻寫模式,    不可讀,檔案不存在則建立,存在則清空内容
  • a:追加模式,     可讀,可寫,檔案不存在則建立,存在則在最後一行追加内容

用"+"可以表示同時讀寫某個檔案

  • r+   可讀可寫
  • w+  可讀可寫  消除檔案内容,然後以寫讀的方式打開檔案
  • a+   可讀可寫  以讀寫方式打開檔案,并把檔案指針移到檔案尾  

注意:r預設打開的是text格式,rb,wb,ab讀取到的内容都是byte位元組,寫入時也要提供位元組類型,後面的字元編碼不能添加.

with open('a.txt', mode='rb',) as f:
    a = f.read()
    print(a)  #輸出為二進制b'\xe6\xaf\x8f\xe5\xa4\xa9\xe9\x83\xbd\xe5\xad\xa6\xe4\xb9\xa0'
    print(a.decode())#每天都學習      

rb模式每次讀取一個位元組,rt模式每次讀取的是一個字元串

with open('a.txt', mode='rb',) as f:
    a = f.read(3)
    print(a)#b'\xe6\xaf\x8f'
with open('a.txt', mode='rt',encoding='utf-8') as f:
    print(f.read(2))#每天      
with open('a.txt', mode='rt',encoding='utf-8') as f:
    print(f.read(2))#每天 讀取前面兩個字元串
with open('a.txt', mode='rt',encoding='utf-8') as f:
    print(f.read())全部讀取
with open('a.txt', mode='rt',encoding='utf-8') as f:
    print(f.readline())#每次讀取一行 
    print(f.readline())
with open('a.txt', mode='rt',encoding='utf-8') as f:
    print(f.readlines())#将讀出來的内容存在一個清單中
    print(f.readable())#是否可讀      
with open('b.txt', mode='wb') as f:
    f.write('abc你好'.encode('utf-8')) #寫入内容至b.txt
    # a = ["菜鳥教程 1\n", "菜鳥教程 2"]
    # f.writelines(a)# 将清單寫入,位元組情況下無法寫入
    print(f.readable())# Fales
    print(f.writable())# True      
with open('b.txt', mode='a', encoding='utf-8') as f:
    print(f.tell())#滑鼠指針目前位置
    f.write('qwe')# 在檔案内容後面添加'qwe'
    print(f.tell())#滑鼠指針目前位置      

控制指針移動:

f.seek(offset,whence)

offset:代表控制指針移動的位元組數

whence:代表參照什麼位置移動 

  • whence =0:參照檔案開頭 特殊:可以在t和b模式下使用
  • whence =1:參照目前所在位置,必須在b模式下使用
  • whence =2:參照檔案末尾,必須在b模式下使用
# with open('a.txt', mode='rt', encoding='utf-8') as f:
#     f.seek(6, 0)#移動的是位元組數,三個位元組為一個漢字
#     msg = f.read(1)
#     print(msg)


# with open('a.txt', mode='rb') as f:
#     f.seek(3, 1)
#     msg = f.read(6)
#     msg = f.read(5)#報錯,因為漢字為三個位元組
#     print(msg.decode('utf-8'))


#參照末尾
with open('a.txt', mode='rb') as f:
    f.seek(-3, 2)
    print(f.tell())
    msg = f.read(3)
    print(msg.decode('utf-8'))      

三、檔案修改

方式一:

将檔案内容由硬碟全部讀入記憶體,在記憶體中完成修改,将記憶體中修改的結果覆寫寫會硬碟

with open('a.txt',mode='rt', encoding='utf-8') as f:
    all_data = f.read()
all_data = all_data.replace('你','zfj')
with open('a.txt', mode='wt', encoding='utf-8') as f:
    f.write(all_data)      

方式二:

1.以讀的方式打開源檔案,以寫的方式打開一個臨時檔案

2.從源檔案中每讀一行内容,修改完畢後寫入臨時檔案,直到源檔案讀取完畢

3.删掉源檔案,将臨時檔案重命名為源檔案

import os
with open('a.txt', mode='rt', encoding='utf-8') as f,open('a_swap.txt',mode='wt', encoding='utf-8')as f1:
    for i in f:
        f1.write(i.replace('哎呀呀','zfj'))
os.remove('a.txt')
os.rename('a_swap.txt', 'a.txt')      

總結:

方式一:在檔案修改過程中硬碟上始終一份資料,記憶體占用過多,不适用于大檔案

方式二:在同一時刻記憶體中隻存放源檔案一行内容,不會占用過多記憶體,缺點是在檔案修改過程中硬碟同時存在兩份資料

每天都要學習!

 

焚膏油以繼晷,恒兀兀以窮年。