檔案操作的三個步驟:
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')
總結:
方式一:在檔案修改過程中硬碟上始終一份資料,記憶體占用過多,不适用于大檔案
方式二:在同一時刻記憶體中隻存放源檔案一行内容,不會占用過多記憶體,缺點是在檔案修改過程中硬碟同時存在兩份資料
每天都要學習!
焚膏油以繼晷,恒兀兀以窮年。