#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:3f.seek(9,0)
f.seek(3,0) # 3
print(f.tell())
f.seek(4,0) #看看列印的結果啊啊啊
res=f.read()
print(res.decode('utf-8'))
#輸出結果為:
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 timewith 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,...