檔案指標移動
大前提:檔案內指標的移動是bytes為單位的,唯獨t模式下的read讀取內容個數是以字元為單位
f.read(3)
with open('a.txt',mode='rt',encoding='utf-8') as f:
data=f.read(3)
print(data)
with open('a.txt',mode='rb') as f:
data=f.read(3)
print(data.decode('utf-8'))
f.seek(指標移動的位元組數,模式控制): 控制檔案指標的移動
模式控制:
0: 預設的模式,該模式代表指標移動的位元組數是以檔案開頭為參照的
1: 該模式代表指標移動的位元組數是以當前所在的位置為參照的
2: 該模式代表指標移動的位元組數是以檔案末尾的位置為參照的
強調:其中0模式可以在t或者b模式使用,而1跟2模式只能在b模式下用
f.tell()檢視檔案指標當前距離檔案開頭的位置
0模式詳解
with open('a.txt',mode='rt',encoding='utf-8') as f:
f.seek(4,0)
print(f.tell())
print(f.read())
with open('a.txt',mode='rb') as f:
f.seek(2,0)
print(f.tell())
print(f.read().decode('utf-8'))
with open('a.txt',mode='rt',encoding='utf-8') as f:
f.seek(5,0)
print(f.read())
1模式詳解
with open('a.txt',mode='rb') as f:
f.seek(3,1)#停留在三後面
print(f.tell())
f.seek(4,1)#3+4=7游標在第七個位元組後
print(f.tell())
print(f.read().decode('utf-8'))
2模式詳解
with open('a.txt',mode='rb') as f:
f.seek(-9,2)
data=f.read()
print(data.decode('utf-8'))
tail -f access.log
with open('access.log',mode='rb') as f:
f.seek(0,2)
while true:
line=f.readline()
if len(line) == 0:
# 沒有內容
continue
else:
print(line.decode('utf-8'),end='')
須知一:
硬碟空間無法修改,硬碟中的資料更新都是用新的內容覆蓋舊的內容
記憶體控制可以修改
with open('a.txt','r+t',encoding='utf-8') as f:
f.seek(4,0)
print(f.tell())
f.write('我擦嘞')
須知二:
檔案對應的是硬碟空間,硬碟不能修改應為檔案本質也不能修改,
我們看到檔案的內容可以修改,是如何實現的呢?
大的的思路:將硬碟中檔案內容讀入記憶體,然後在記憶體中修改完畢後再覆蓋回硬碟
具體的實現方式分為兩種:
1. 將檔案內容發一次性全部讀入記憶體,然後在記憶體中修改完畢後再覆蓋寫回原檔案
優點: 在檔案修改過程中同乙份資料只有乙份
缺點: 會過多地占用記憶體
with open('db.txt',mode='rt',encoding='utf-8') as f:
data=f.read()
with open('db.txt',mode='wt',encoding='utf-8') as f:
f.write(data.replace('kevin','sb'))
# 2. 以讀的方式開啟原檔案,以寫的方式開啟乙個臨時檔案,一行行讀取原檔案內容,修改完後寫入臨時檔案...,刪掉原檔案,將臨時檔案重新命名原檔名
優點: 不會占用過多的記憶體
缺點: 在檔案修改過程中同乙份資料存了兩份
import os
with open('db.txt',mode='rt',encoding='utf-8') as read_f,\
open('.db.txt.swap',mode='wt',encoding='utf-8') as wrife_f:
for line in read_f:
wrife_f.write(line.replace('sb','kevin'))
os.remove('db.txt')
os.rename('.db.txt.swap','db.txt')
檔案內指標移動
大前提 檔案內指標的移動是bytes為單位的,唯獨t模式下的read讀取內容個數是以字元為單位 f.seek 指標移動的位元組數,模式控制 控制檔案指標的移動 模式控制 0 預設的模式,該模式代表指標移動的位元組數是以檔案開頭為參照的 1 該模式代表指標移動的位元組數是以當前所在的位置為參照的 2 ...
檔案的操作之指標移動
要點 指標的移動都是以bytes為單位的,但是只有在t模式下的read n 這裡的n代表的是字元個數。with open aaa.txt mode rt encoding utf 8 as f res f.read 4 print res 讀取四個字元 一 f.seek n,模式 n指的是移動的位元...
控制檔案內指標移動
一 f.seek 位元組個數,模式 模式有三種 0 參照檔案的開頭 1 參照當前所在的位置 2 參照檔案末尾的位置 注意 1 無論何種模式,都是以位元組單位移動,只有t模式下的read n 的n代表的是字元個數 with open a.txt mode rt encoding utf 8 as f ...