檔案指標的移動 新增

2022-07-28 18:18:17 字數 2498 閱讀 1322

檔案指標移動

大前提:檔案內指標的移動是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 ...