日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python读写文件的文本模式_Python中文件的读写、写读和追加写读三种模式的特点...

發(fā)布時間:2023/12/20 python 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python读写文件的文本模式_Python中文件的读写、写读和追加写读三种模式的特点... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本文主要討論一下文件的三種可讀可寫模式的特點及互相之間的區(qū)別,以及能否實現(xiàn)修改文件的操作

由于前文已經(jīng)討論過編碼的事情了,所以這里不再研究編碼,所有打開操作默認都是utf-8編碼(Linux系統(tǒng)下)

首先我們看r+(讀寫)

既然r+既能讀又能寫,那么能否實現(xiàn)在r+模式下進行文件的修改呢?答案是肯定的!,但是,有一點你需要注意,除非你知道在確切的位置修改確切的內容,否則往往不會得到你期望的結果。舉個例子如下:

我們有這樣一個文本“十步殺一人,千里不留行”

假設有這樣一個需求,把“十步殺一人”改成“十步殺一個土匪”,初步設想是:用read(4)讀取到漢字“一”,然后寫入漢字“個土匪”:

with open('job', mode='r+') as f:

print('先讀取四個字符:',f.read(4))

print('讀取后的指針位置:',f.tell())

f.write('個土匪')

f.seek(0)

print(f.read())

輸出為:

先讀取四個字符: 十步殺一

讀取后的指針位置: 12

十步殺一人,千里不留行個土匪

從結果可以看到,使用read(4)指針確實移動到了指定的位置,但是寫入的時候卻沒有按照設想,而是跑到了文件的末尾。這個原因涉及到一個叫“CHUNK”的東西,俺滴老師沒教,我也不好深說,等深入理解它后再和你們講哈😅😅😅

那么我們只說解決辦法,可以用seek()手動定位指針,讓它處在12的位置,然后再寫入:

with open('job', mode='r+') as f:

print('先讀取四個字符:',f.read(4))

print('讀取后的指針位置:',f.tell())

f.seek(f.tell())

f.write('個土匪')

f.seek(0)

print(f.read())

輸出:

先讀取四個字符: 十步殺一

讀取后的指針位置: 12

十步殺一個土匪里不留行

從結果可以看出,它確實是把人字改成了“個土匪”,可是它卻把后面的字給覆蓋了,這完全不是我們想要的結果,那么為什么呢?

原因就是:當文件寫入磁盤后,磁盤會分出一塊空間(實際上應該叫多個存儲元的集合,具體請參考我另外一篇文章),這塊空間是固定的,當你定位指針修改已經(jīng)存在的內容時,相鄰的后面的內容并不會給你要寫入的內容“讓地方”,也就是說你可以對它進行覆蓋操作,但是你不能讓后面的內容挪地方(這么說直白不?應該能明白吧。), 因此,雖然我們想要修改的是人這個字,但是由于你寫入了“個土匪”三個字,所以后面的內容被覆蓋了,變成了“十步殺一個土匪里不留行”。

接下來我們看看w+(寫讀模式)

w+,也就是寫讀操作,仍然對文件libai2操作,需求還是上例的需求

with open('libai2','w+') as f:

content = f.read(25)#讀取25個字符,這其中包括24個中文漢字或符號 和 一個換行符

print('讀取操作后的指針位置:',f.tell())#指針處在0,那么意味著文件內容是空的

f.write('五')#然后我們寫入中文漢字:“五”,期待能覆蓋掉原來的“十”

print('寫入操作后的指針位置:',f.tell())#結果發(fā)現(xiàn)指針在3字節(jié)的位置,也就是一個漢字五的后面

f.seek(0)

print(f.read())

讀取操作后的指針位置: 0

寫入操作后的指針位置: 3

我們可以看到整個文件的內容消失了,只有一個漢字“五”

這是因為w開頭的模式會先進行判斷,如果文件已存在則打開文件,并且清空文件內容。如果該文件不存在,則創(chuàng)建新文件。

所以當使用w+這種模式打開文件的那一刻,這個文件原本的內容就已經(jīng)消失了。

最后我們看看a+(追加寫讀模式)

我們在后臺從新創(chuàng)建了一個libai3文件,里面還是只包含那兩句詩

with open('libai3','a+') as f:

print('初始指針位置',f.tell())

#初始指針位置是146,48個漢字或字符 加2個換行符,48*3+2=146

#由此可以看出,初始文件指針處在文件末尾位置

f.seek(73) #我們把指針調整到73字節(jié)的位置,也就是漢字“十”的前面

print('調整指針在73字節(jié)的位置:',f.tell())

f.write('五')#然后我們寫入漢字“五”

f.seek(0) #調整指針到文件頭部位置

print(f.read()) #輸出文件看看發(fā)生了什么

初始指針位置 146

調整指針在73字節(jié)的位置: 73

趙客縵胡纓,吳鉤霜雪明。銀鞍照白馬,颯沓如流星。

十步殺一人,千里不留行。事了拂衣去,深藏身與名。

我們發(fā)現(xiàn)漢字“五”還是被寫在了文件末尾

總結

w+和a+無法完成文件的修改操作,r+可以實現(xiàn)修改的操作,但是結果往往和我們預期的不太一樣,當然,除非你知道要把確切的內容換成確切的新內容,不過感覺這個應用價值不大吧?

總結

以上是生活随笔為你收集整理的python读写文件的文本模式_Python中文件的读写、写读和追加写读三种模式的特点...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。