python文件操作:文件指針移動、修改


本文目錄:
 
 
 

一、文件指針移動

#大前提:文件內指針的移動是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: 該模式代表指針移動的字節數是以當前所在的位置為參照的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(4,0)
#     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)
#     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')

 

        


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM