python 檔案之指標操作

2022-09-16 16:18:20 字數 3193 閱讀 3017

一:檔案內指標移動的單位是什麼?

讀出二進位制解碼的到的字串:

只有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')

優點:省記憶體空間,記憶體同一時刻只有檔案的一行內容

缺點:浪費硬碟檔案,在修改過程中會存放兩份資料

Python檔案操作之指標

在檔案讀取過程中使用了指標這個概念 在一開始指標是指向檔案內容的開端的,伴隨著讀寫的進行指標一步一步往後挪 例如 f open g liumang.txt r data f.read tell 是求指標在 print f.tell print type data data f.write asdfd...

python檔案的基本操作之控制檔案指標

1.檔案基本操作 r t 可讀 可寫 w t 可寫 可讀 a t 可追加寫 可讀 r b w b a b 一樣的 2.檔案游標的移動 f.seek offset,whence offset代表檔案的指標的偏移量,單位是位元組bytes whence代表參考物,有三個取值 0 參照檔案的開溝 1 參照...

檔案的IO操作之檔案指標

這裡面說的檔案指標也可以理解為檔案內部記錄讀取或者寫入的當前位置,不然程式如何知道下一次該從檔案的什麼位置開始讀取或者寫入呢?在讀寫檔案的時候,每讀取或者寫入乙個位元組,磁碟中的檔案指標就會向後移動乙個位元組。可以通過控制指標的位置,以便在我們需要的位置進行讀寫檔案。檔案流提供以下成員函式來讀取或配...