文件指針的移動,文件的修改


一、可讀、可寫

#r+t:可讀、可寫

'''b.txt內容:你多大'''
#w+t:可寫、可讀
# with open('b.txt','w+t',encoding='utf-8') as f:
#     print(f.readable())      #判斷結果為True,說明w+對文件可讀可寫
#     print(f.writable())
#a+t:可追加寫、可讀

#r+b
#w+b
#a+b

# with open('b.txt',mode='rb') as f:  #b模式下不需要指定字符編碼
#     data=f.read()                   #一次全部讀取文件中的內容
#     print(data)                     #b'\xe5\xa4\xa7\xe5\xa4\x9a\xe4\xba\xba'  b模式下是以bytes為單位可以理解為二進制,所以打印要進行解碼decode
#     print(data.decode('utf-8'))     #大多人


# with open('b.txt',mode='rt',encoding='utf-8') as f:
#     data=f.read()                      #t模式下是以str為單位,所以打印的結果為大多人
#     print(data)


'''a.txt內容:
111111111111
2222
3333
3333
44444小紅帽小紅帽小紅帽'''
# with open('a.txt',mode='r+',encoding='utf-8') as f:
#     print(f.readline())       #每次讀取文件的一行內容
#     print(f.readline())       #指針移到行首,讀取一行,並進行換行
#     print(f.readlines())     #將文件的內容全部讀取出來,以字符串的形式放入到一個列表中
#     f.write('小紅帽')       #r+模式,默認是將添加的內容,添加到文件的末尾

二、文件指針的移動

# 文件中指針的移動
# f.seek(offset,whence)。。。。。。。。。。。。
#offset代表文件的指針的偏移量,單位是字節bytes
#whence代表參考物,有三個取值
#0:參照文件的開頭
#1:參照當前文件指針所在位置
#2: 參照文件末尾,(所以此時偏移量應該為負值)
#ps:快速移動到文件末尾f.seek(0,2)

'''
c.txt內容:
大多人的帥都是我擦了在表面的帥,只有egon的帥才是發自內心的
兩個黃麗鳴翠柳,一行白鷺上青天
在egon美麗的外表下隱藏了一顆騷動的心
這顆心叫七竅玲瓏心
男人吃了會流淚
女人吃了會懷孕
'''
#強調:其中whence=1和whence=2只能在b模式下使用
# f=open('c.txt',mode='rt',encoding='utf-8')
# f.seek(9,0)     #移動的偏移量9的單位是bytes,即在utf-8下,移動三個中文字符
# print(f.tell()) # 每次統計都是從文件開頭到當前指針所在位置
# print(f.readline())  #指針移動9個bytes,此時參照文件的開頭,讀取第一行的內容為:的帥都是我擦勒浮在表面的帥,只有egon的帥才是發自內心的
# f.close()


# f=open('c.txt',mode='rb')
# f.readline()     #此時文件的指針已經移到了第二行的開頭
# f.seek(6,1)    #相對當前位置,移動6個bytes,即指針移動了兩個中文的字符的長度
# print(f.readline().decode('utf-8'))     #以指針移動后的結果繼續往后讀完一行內動,並將bytes進行解碼
# print(f.tell())     # 每次統計都是從文件開頭到當前指針所在位置,
# f.close()


# f=open('c.txt',mode='rb')
# f.seek(-9,2)       #相對文件末尾進行移動9個bytes所以偏移量應該為負值
# print(f.readline().decode('utf-8'))   #會懷孕
# print(f.tell())       # 每次統計都是從文件開頭到當前指針所在位置,264
# f.close()



# 了解(**)
# 只有在t模式下的read(n),n代表的是字符個數,除此之外其他但凡涉及文件指針的移動都是以字節為單位的
# f=open('c.txt',mode='rt',encoding='utf-')
# print(f.read(3))     #從文件的開頭開始,讀取三個字符,而不是三個字節即bytes
# f.close()

# f=open('c.txt',mode='rb',)
# print(f.read(3).decode('utf-8'))     #b模式下讀取的是三個字節即3個bytes而非三個字符的長度,讀取結果為:大
# f.close()


# ab a+b r+b
# f=open('b.txt',mode='at',)    #如:你多大了呀,臭傻逼,截斷后結果:你多大
# f.truncate(9) # 參照物永遠是文件開頭,從文件開頭寫9個bytes,之后的內容都被截斷掉,即被清除掉,是一種寫文件的操作
# f.close()

 

三、文件修改的兩種方式

# 通過指針的移動完成對文件內容的修改
# with open('c.txt','r+t',encoding='utf-8') as f:
    # f.seek(21,0)                 #從文件的開頭移動21個字節,即21個bytes,
    # f.write('[我擦勒]')        #會報錯,因為[我擦勒]是11個字節,不能完全替換掉源文件中的4個中文字符
    # f.write('我擦了')            #移動21個字節,然后用我擦了覆蓋掉后面三個字符,而不是插入的修改,因為硬盤沒有修改這么一說,
                                 #都是將內容讀到內存中修改后,重新寫到硬盤中取,覆蓋原來的內容,從而完成對文件的修改


'''
d.txt內容:
my name is ALEXSB
ALEXSB say hahahah
ALEXSB say my name is SB
SB is ALEXSB
egon is beautiful
'''
#修改文件內容的方式一:
#思路:先將原文件內容一次性全部讀入內存,然后在內存修改完畢后,再
#覆蓋寫回原文件
#優點:在修改期間,文件內容只有一份
#缺點:當文件過大的情況下或占用過多的內存空間

# with open('d.txt','rt',encoding='utf-8') as read_f:
#     msg=read_f.read()
#     msg=msg.replace('alex','xiang')
#     # print(msg)
#
# with open('d.txt','wt',encoding='utf-8') as write_f:
#     write_f.write(msg)

#修改文件內容的方式二:
#思路:
#1、以讀的方式打開原文件,以寫的方式打開一個新文件
#2、從原文件中循環讀取每一行內容修改后寫入新文件
#3、刪除原文件,將新文件重命名為原文件的名字

#優點:同一時刻只有一行內容存在於內存中
#缺點:在修改期間,文件內容始終存在兩份,但修改完畢后會只留一份
import os
with open('d.txt','rt',encoding='utf-8') as read_f,\
        open('d.txt.swap','wt',encoding='utf-8') as write_f:
    for line in read_f:
        write_f.write(line.replace('xiang','ALEXSB'))    #每讀一行內容,將每行中的'xiang'替換成'ALEXSB'

os.remove('d.txt') # 刪除老文件
os.rename('d.txt.swap','d.txt')   #將修改后的文件'd.txt.swap'重新命名為源文件的名字'd.txt'

 


免責聲明!

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



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