Python檔案高階操作

2022-07-07 04:12:24 字數 3852 閱讀 1746

#1

# 指標移動的單位都是以bytes/位元組為單位

# 只有一種情況特殊:

# t模式下的read(n),n代表的是字元個數

db.txt檔案中的內容為:

yanjialuo:123zhangchenxiao:123
with open(r'db.txt',mode='rt',encoding='utf-8') as f:

f.seek(3,0) #這裡指標移動了相對於檔案開頭位置移動了3個位元組,而utf-8編碼中乙個英文本元用乙個位元組表示,移動了3個位元組即移動了3個英文本元

res=f.read()

print(res)

#輸出結果為:

jialuo:123zhangchenxiao:123

# f.seek(n,模式):n指的是移動的位元組個數

# 模式:

# 模式0:參照物是永遠是檔案開頭位置

# f.seek(9,0)

# f.seek(3,0) # 3 注意還是在3

# 模式1:參照物是當前指標所在位置

# f.seek(9,1)

# f.seek(3,1) # 在9的基礎位置上(即當前的位置為9)移動了3個位置,現在位置為12

# 模式2:參照物是檔案末尾位置,應該倒著移動,不是不可以順著移動,而是順著移動沒有意義

# f.seek(-9,2) # 3

# f.seek(-3,2) # 9

# 強調:只有0模式可以在t下使用,1、2必須在b模式下用,無論在哪種模式下,移動的單位都是位元組。只有一種模式就是t模式下的read(n)是字元

# f.tell() # 獲取檔案指標當前位置

#示例

1

with open('db.txt',mode='rb') as f:

f.seek(9,0)

f.seek(3,0) # 3

print(f.tell())

f.seek(4,0) #看看列印的結果啊啊啊

res=f.read()

print(res.decode('utf-8'))

#輸出結果為:

3  

ialuo:123zhangchenxiao:123

2

with open('db.txt',mode='rb') as f:

f.seek(9,1)

f.seek(3,1)

print(f.tell())

#輸出結果為12

3

with open('db.txt',mode='rb') as f:

f.seek(-9,2)

# print(f.tell())

f.seek(-3,2)

# print(f.tell())

print(f.read().decode('utf-8'))

#輸出結果:123

#示例:f.seek()的應用  監視乙個檔案的輸入,並將檔案輸入的內容顯示出來

import time

with open('access.log', mode='rb') as f:

# 1、將指標跳到檔案末尾

# f.read() # 錯誤的做法,可能會導致撐爆記憶體,因為日誌檔案會越來越大

f.seek(0,2) #直接效果,指標移動到檔案末尾

while true: #只要沒有新檔案過來,就一直在那迴圈,但是只要你有檔案過來,我就可以輸出你輸入的內容

line=f.readline()

if len(line) == 0:

time.sleep(0.3) #簡短的睡幾秒

else:

print(line.decode('utf-8'),end='')

#檔案修改的兩種方式

#你以為檔案修改的方式:

a.txt的內容為:

張一蛋     安徽    179    49    12344234523

李二蛋 河北 163 57 13913453521

王全蛋 山西 153 62 18651433422

現在張一蛋後面加上男婦女主任,使用下面的修改方式
# with open(r'a.txt',mode='r+t',encoding='utf-8') as f:

# f.seek(9,0) #將指標調到蛋後面那個位置,因為在utf-8編碼下,乙個中文字元佔3個位元組

# f.write('男婦女主任') #不行,這裡是覆蓋寫!!!!

#執行完畢後a.txt內的內容為:(出錯,這裡是覆蓋寫)

張一蛋男婦女主任179    49    12344234523

李二蛋 河北 163 57 13913453521

王全蛋 山西 153 62 18651433422

#通用的執行檔案修改有兩種方式,現在我們將a.txt的內容還原

# 實現思路:將檔案內容發一次性全部讀入記憶體,然後在記憶體中修改完畢後再覆蓋寫回原檔案

# 優點: 在檔案修改過程中同乙份資料只有乙份,硬碟空間沒有浪費

# 缺點: 會過多地占用記憶體

# with open('a.txt',mode='rt',encoding='utf-8') as f:

# res=f.read()

# data=res.replace('安徽','上海')

# print(data)

## with open('a.txt',mode='wt',encoding='utf-8') as f1:

# f1.write(data)

執行完畢後:a.txt內容為

張一蛋     上海    179    49    12344234523

李二蛋 河北 163 57 13913453521

王全蛋 山西 153 62 18651433422

# 方式二:

import os #引用別人的功能 如果在程式中涉及到建議使用方式二,畢竟磁碟**越來越便宜

# 實現思路:以讀的方式開啟原檔案,以寫的方式開啟乙個臨時檔案,一行行讀取原檔案內容,修改完後寫入臨時檔案...,刪掉原檔案,將臨時檔案重新命名原檔名

# 優點: 不會占用過多的記憶體

# 缺點: 在檔案修改過程中同乙份資料存了兩份

with open('a.txt', mode='rt', encoding='utf-8') as f, \

open('.a.txt.swap', mode='wt', encoding='utf-8') as f1:

for line in f:

f1.write(line.replace('河北', '河南')) #這裡使用的是字串的替換功能

os.remove('a.txt')

os.rename('.a.txt.swap', 'a.txt') #速度很快,你看的好像是在原始檔上改的

Python 高階檔案操作

python內建的os模組除了可以對目錄進行操作,還可以對檔案進行一些高階操作,具體函式如下 函式說明 access path,accessmode 獲取對檔案是否有指定的訪問許可權 讀取 寫入 執行許可權 accessmode的值是r ok 讀取 w ok 寫入 x ok 執行 或f ok 存在 ...

python檔案高階操作

檔案過大保護 由於read是一次性讀取檔案所有的內容,如果檔案100g,記憶體就會吃不消,所以推薦使用read size 一次讀取指定位元組 字元 根據rb,或者rt指定不同的讀取內容 或者readline 每次讀取一行等操作重複讀,避免這種情況 同時讀寫操作 不推薦愛使用 檔案指標 首先硬碟上從來...

python高階 檔案讀寫操作

python讀寫檔案 1.open 使用open開啟檔案後一定要記得呼叫 檔案物件的close 方法。比如可以用try finally語句來確保最後能關閉檔案。f1 open thisfile.txt try f1.read finally f1.close 2.讀檔案 read,readline,...