一、可讀、可寫
#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'