檔案處理的開啟方式、操作方法、指標的移動、修改方法
一、檔案處理的開啟模式
控制檔案讀寫操作的模式:
檔案控制代碼 = open('檔案路徑', '模式')
1. 開啟檔案的模式有(預設為文字模式):
r ,只讀模式【預設模式,檔案必須存在,不存在則丟擲異常】
w,只寫模式【不可讀;不存在則建立;存在則清空內容】
a, 之追加寫模式【不可讀;不存在則建立;存在則只追加內容】
2. 對於非文字檔案,我們只能使用b模式,"b"表示以位元組的方式操作(而所有檔案也都是以位元組的形式儲存的,使用這種模式無需考慮文字檔案的字元編碼、圖片檔案的jgp格式、視訊檔案的avi格式)
rb
wb
ab
注:以b方式開啟時,讀取到的內容是位元組型別,寫入時也需要提供位元組型別,不能指定編碼
3. 瞭解部分
"+" 表示可以同時讀寫某個檔案
r+, 讀寫【可讀,可寫】
w+,寫讀【可讀,可寫】
a+, 寫讀【可讀,可寫】
x, 只寫模式【不可讀;不存在則建立,存在則報錯】
x+ ,寫讀【可讀,可寫】
xb
二、操作檔案的方法:
掌握
f.read() #讀取所有內容,游標移動到檔案末尾
f.readline() #讀取一行內容,游標移動到第二行首部
f.readlines() #讀取每一行內容,存放於列表中
f.write('1111\n222\n') #針對文字模式的寫,需要自己寫換行符
f.write('1111\n222\n'.encode('utf-8')) #針對b模式的寫,需要自己寫換行符
f.writelines(['333\n','444\n']) #檔案模式
f.writelines([bytes('333\n',encoding='utf-8'),'444\n'.encode('utf-8')]) #b模式
瞭解
f.readable() #檔案是否可讀
f.writable() #檔案是否可讀
f.closed #檔案是否關閉
f.encoding #如果檔案開啟模式為b,則沒有該屬性
f.flush() #立刻將檔案內容從記憶體刷到硬碟
f.name
三、檔案內游標移動
1、read(3):
1). 檔案開啟方式為文字模式時,代表讀取3個字元
2). 檔案開啟方式為b模式時,代表讀取3個位元組
2、 其餘的檔案內游標移動都是以位元組為單位如seek,tell,truncate
注意:
1).seek有三種移動方式0,1,2,其中1和2必須在b模式下進行,但無論哪種模式,都是以bytes為單位移動的
主動控制指標移動
f.seek(移動的位元組個數,模式)
模式有三種:
0: 永遠參照檔案開頭
1:參照當前所在的位置#
2:永遠參照檔案末尾
注意:只有0模式可以在t下使用,1和2只能在b模式下使用
with open('a.txt',mode='rt',encoding='utf-8') as f:
f.seek(3,0)
f.seek(5,0)
print(f.tell())
with open('a.txt',mode='rb') as f:
f.seek(3,1)
f.seek(5,1)
print(f.tell())
res=f.read()
print(res.decode('utf-8'))
with open('a.txt',mode='rb') as f:
f.seek(-3,2)
print(f.tell())
f.seek(0,2)
2).truncate是截斷檔案,所以檔案的開啟方式必須可寫,但是不能用w或w+等方式開啟,因為那樣直接清空檔案了,所以truncate要在r+或a或a+等模式下測試效果
案例:
import time
with open('test.txt','rb') as f:
f.seek(0,2)
while True:
line=f.readline()
if line:
print(line.decode('utf-8'))
else:
time.sleep(0.2)
四、檔案的修改
修改檔案的方式一:
1、先將檔案內容全部讀入記憶體
2、在記憶體中完成修改
3、將修改後的內容覆蓋回原檔案
import os
with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f:
data=read_f.read() #全部讀入記憶體,如果檔案很大,會很卡
data=data.replace('alex','SB') #在記憶體中完成修改
write_f.write(data) #一次性寫入新檔案
os.remove('a.txt')
os.rename('.a.txt.swap','a.txt')
p s: 耗費記憶體不耗費硬碟~~~
修改檔案的方式二:
1、以讀的方式開啟原檔案,然後以寫的方式開啟一個臨時檔案
2、讀原檔案的一行內容到記憶體,然後在記憶體中修改完畢後再寫入臨時檔案,迴圈往復直到全部改完
3、刪出原檔案,將臨時檔案重新命名為原檔名
import os
with open('e.txt',mode='rt',encoding='utf-8') as src_f,open('.e.txt.swp',mode='wt',encoding='utf-8') as dst_f:
for line in src_f:
dst_f.write(line.replace('EGON','egon'))
os.remove('e.txt')
os.rename('.e.txt.swp','e.txt')
p s: 耗費硬碟不耗費記憶體
==建議使用方式二