一:文件內指針移動的單位是什么?
讀出二進制解碼的到的字符串:
只有t模式下,read(n),n是字符個數
with open('a.txt', mode='rt',encoding='utf-8') as f: # 你好呀hello word
data = f.read(6)
print(f.tell()) # 12
print(data) # 你好呀hel
b模式下read(n),n是多少個二進制數bit
8bit=>1Byte
1024Byte = 1KB
1024KB=1MB
1024MB=1GB
1024GB=1TB
1GB=1024*1024*8
with open('a.txt',mode='rb') as f:
data =f.read(6)
print(f.tell()) # 6
print(data.decode('utf-8')) # 你好
以b模式讀取文件內容
with open('a.txt', mode='rb') as f:
data = f.read(9) # 在utf-8編碼保存文件一個中文字符占3個byte
print(type(data))
print(len(data))
print(data.decode('utf-8'))
b.txt 文件是以gbk編碼保存的文件,底層存的是二進制
gbk編碼中文占連個byte
with open('b.txt', mode='rb') as f: # hello你好
data = f.read(7)
print(type(data))
print(len(data))
print(data.decode('utf-8')) # 報錯 你以gbk編碼寫入文件的,同樣都出來,也是gbk編碼讀出來
print(data.decode('gbk'))
二 主動/單獨地控制文件指針移動
f.seek(x,y)
x代表移動的字節個數
y代表模式(0,1,2)b
0:代表指針參照物是文件開頭,可以在t模式和b模式下使用
b.txt是以utf-8編碼存儲到文件中
with open('b.txt', mode='rt', encoding='utf-8') as f: # 從刪庫到跑路
data = f.read(2)
print(data) # 從刪
print(f.tell()) # 6
1:代表的是當前位置,只能在b模式下用
c.txt他是utf-8編碼存的
with open('c.txt',mode='rb') as f: # 你好word
f.read(1)
print(f.tell()) # 1
f.seek(2, 1)
print(f.tell()) # 3
print(f.read().decode('utf-8')) # 好word
2:代表的是參照物在文件末尾,只能以b模式下用
with open('d.txt', mode='rb') as f: # 你好word真難
f.seek(250, 2)
print(f.tell()) # 16+250=266
f.seek(-3, 2)
print(f.tell()) # 13
f.seek(0, 2) # 快速將指針移動到文件末尾(可以用a模式打開也一樣
print(f.tell()) # 16
開發 tailf -f 命令
import time
with open(r'D:\s9\day10\acess.log', mode='rb') as f:
f.seek(0, 2)
while True:
line = f.readline()
if len(line) == 0:
time.sleep(1)
else:
print(line.decode('utf-8'),end='')
日志生成器
import time
with open('acess.log', mode='at', encoding='utf-8') as f:
f.write('%s 你這個程序是死循環\n' % (time.strftime('%Y-%m-%d %H:%M:%m')))
文件修改
文件修改都是模擬出來的,實現修改需要借助內存
硬盤數據沒有修改的說法,都是用新內容覆蓋舊的內容
有兩種方式
方式一
1:硬盤中的內容全部讀入內存,
2:把內存中的數據一次性修改完畢
3:把內存中修改完成的結果覆蓋會原文件
with open('f.txt', mode='rb') as f_read: # 你好word真難
data = f_read.read().decode('utf-8')
res = data.replace('word', '世界')
print(res)
with open('f.txt', mode='wb') as f_write:
f_write.write(res.encode('utf-8'))
缺點:浪費內存,有可能文件過大,撐爆內存
優點:不費硬盤空間,數據只存一份
方式二
1:把硬盤內容全部讀入內存
2:在內存中把內容一次性修改完畢,臨時存儲到硬盤中
3:讓后把臨時文件重新命名,源文件刪除掉
import os
with open('f.txt', mode='rt',encoding='utf-8') as read_f,\
open(".f.txt.swap",mode='wt',encoding='utf-8') as write_f: # 你好世界真難
for line in read_f:
write_f.write(line.replace("word",'世界'))
os.remove('f.txt')
os.rename('.f.txt.swap', 'f.txt')
優點:省內存空間,內存同一時刻只有文件的一行內容
缺點:浪費硬盤文件,在修改過程中會存放兩份數據