1. 程式人生 > >python 文件處理

python 文件處理

eal margin 內部 成了 for one 只讀 fad enc

Python文件處理

文件在硬盤上是以某種編碼格式的 “010101010101001” 保存在硬盤上。

件讀

1 f = open(python_file.txt,r,encoding=utf-8)
2
3 #          文件路徑       只讀模式     以什麽樣的編碼方式去讀或寫
4 
5 data = f.read() #表示讀取所有內容,內容是已經轉換完畢的字符串。
6 
7 print(data)
8 
9 f.close()       #關閉文件

PS: 此處的encoding必須和文件在保存時設置的編碼一致,

不然“斷句”會不準確從而造成亂碼。

1 f = open(python_file.txt,rb)  # ‘rb‘以二進制模式讀取
2 
3 data = f.read()
4 
5 print(data)         # b‘python\xe5\xbe\x88\xe6\xa3\x92‘
6 
7 print(data.decode()) # python很棒
8 
9 f.close()

不知道編碼,用chardet解決

1 import chardet
2 
3 result = chardet.detect(open(
python_file.txt,mode=rb).read()) 4 5 print(result) #{‘encoding‘: ‘utf-8‘, ‘confidence‘: 0.7525, ‘language‘: ‘‘}

循環文件

1 f = open("python_file",r,encoding="utf-8")
2 
3  for line in f:
4 
5     print(line)
6 
7 f.close()

寫入

f = open(python_file.txt,mode=w,encoding=
utf-8) f.write(life is short ) f.close() 二進制寫 f = open(二進制寫.txt,wb) f.write(life is short ,I chose python.encode(utf-8)) # 表示寫入內容,寫入的內容必須字節類型 f.close()

追加

把內容追加到文件尾部

f = open("python_file.txt",a,encoding="utf-8")
f.write("linux is not unix")
f.close()

文件操作時,以 “a”或“ab” 模式打開,則只能追加,即:在原來內容的尾部追加內容

寫入到硬盤上時,必須是某種編碼的0101010,

打開時需要註意:

ab,寫入時需要直接傳入以某種編碼的0100101,即:字節類型

a 和 encoding,寫入時需要傳入unicode字符串,內部會根據encoding制定的編碼將unicode字符串轉換為該編碼的 010101010

讀寫模式

f = open("python_file.txt",r+,encoding="utf-8")
data = f.read() #可以讀內容 
print(data)
f.write("life is short") #可以寫
f.close()

寫讀模式

f = open("pythoner.txt",w+,encoding="utf-8")
data = f.read() 
print(data)
f.write("\nnewline 1 python is good")
f.write("\nnewline 2 life is short")
f.write("\nnewline 3 I chose python")
f.write("\nnewline 4 linux is not unix")
print("content",f.read())
f.close()

w+會先把文件清空,再寫新內容,相比w模式,只是支持了一個讀功能,且還只能讀已經寫入的新內容

文件操作的其它功能


技術分享圖片

  def fileno(self, *args, **kwargs): # real signature unknown
        返回文件句柄在內核中的索引值,以後做IO多路復用時可以用到
 
    def flush(self, *args, **kwargs): # real signature unknown
        把文件從內存buffer裏強制刷新到硬盤
 
    def readable(self, *args, **kwargs): # real signature unknown
        判斷是否可讀
 
    def readline(self, *args, **kwargs): # real signature unknown
        只讀一行,遇到\r or \n為止
 
    def seek(self, *args, **kwargs): # real signature unknown
        把操作文件的光標移到指定位置
        *註意seek的長度是按字節算的, 字符編碼存每個字符所占的字節長度不一樣。
        如“路飛學城” 用gbk存是2個字節一個字,用utf-8就是3個字節,因此以gbk打開時,seek(4) 就把光標切換到了“飛”和“學”兩個字中間。
        但如果是utf8,seek(4)會導致,拿到了飛這個字的一部分字節,打印的話會報錯,因為處理剩下的文本時發現用utf8處理不了了,因為編碼對不上了。少了一個字節
 
    def seekable(self, *args, **kwargs): # real signature unknown
        判斷文件是否可進行seek操作
 
    def tell(self, *args, **kwargs): # real signature unknown
        返回當前文件操作光標位置 
 
    def truncate(self, *args, **kwargs): # real signature unknown
        按指定長度截斷文件
        *指定長度的話,就從文件開頭開始截斷指定長度,不指定長度的話,就從當前位置到文件尾部的內容全去掉。
 
    def writable(self, *args, **kwargs): # real signature unknown
        判斷文件是否可寫
View Code

修改文件

嘗試直接以r+模式打開文件,默認會把新增的內容追加到文件最後面(最新測試r+會從頭覆蓋,測試代碼如下)

f1 = open("python_file.txt",w,encoding=utf-8)
f1.write("[元貞]")
f1.close()
f2 = open("python_file.txt",r+,encoding="utf-8")
# print(f2.read())    #先讀後寫就不會被覆蓋,而是追加   
f2.write(fade_walk)
f2.close()

seek,之所以內容會追加到最後面,是因為,文件一打開,要寫的時候,光標會默認移到文件尾部,再開始寫

f = open("contact.txt",r+,encoding="utf-8")
f.seek(6)
f.write("mysql")
f.close()

但是執行後插入的內容把插入處後面的內容覆蓋掉

  這是硬盤的存儲原理導致的,當你把文件存到硬盤上,就在硬盤上劃了一塊空間,存數據,等你下次打開這個文件 ,seek到一個位置,每改一個字,就是把原來的覆蓋掉,如果要插入,是不可能的,因為後面的數據在硬盤上不會整體向後移。所以就出現 當前這個情況 ,你想插入,卻變成了會把舊內容覆蓋掉。

問:但是人家word, vim 都可以修改文件呀,你這不能修改算個什麽玩意?

  你想修改當然可以,就是不要在硬盤上修改,把內容全部讀到內存裏,數據在內存裏可以隨便增刪改查,修改之後,把內容再全部寫回硬盤,把原來的數據全部覆蓋掉。vim word等各種文本編輯器都是這麽幹的。

  如果不想占內存,只能用另外一種辦法啦,就是邊讀邊改, 什麽意思? 不是不能改麽?是不能改原文件 ,但你可以打開舊文件 的同時,生成一個新文件呀,邊從舊的裏面一行行的讀,邊往新的一行行寫,遇到需要修改就改了再寫到新文件 ,這樣,在內存裏一直只存一行內容。就不占內存了。 但這樣也有一個缺點,就是雖然不占內存 ,但是占硬盤,每次修改,都要生成一份新文件,雖然改完後,可以把舊的覆蓋掉,但在改的過程中,還是有2份數據 的。

python 文件處理