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

歡迎訪問 生活随笔!

生活随笔

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

python

【Python编程】九、Python文件操作

發(fā)布時間:2024/1/18 python 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Python编程】九、Python文件操作 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

歡迎關注博主 Mindtechnist 或加入【Linux C/C++/Python社區(qū)】一起探討和分享Linux C/C++/Python/Shell編程、機器人技術、機器學習、機器視覺、嵌入式AI相關領域的知識和技術。


九、Python文件操作

      • open(pathname) 打開文件
      • 二進制打開文件
      • 回車換行符
      • 文件操作


專欄:Python從入門到實戰(zhàn)


open(pathname) 打開文件

模式描述
r以只讀方式打開文件。文件的指針將會放在文件的開頭。這是默認模式。
rb以二進制格式打開一個文件用于只讀。文件指針將會放在文件的開頭。這是默認模式。
r+打開一個文件用于讀寫。文件指針將會放在文件的開頭。
rb+以二進制格式打開一個文件用于讀寫。文件指針將會放在文件的開頭。
w打開一個文件只用于寫入。如果該文件已存在則打開文件,并從開頭開始編輯,即原有內容會被刪除。如果該文件不存在,創(chuàng)建新文件。
wb以二進制格式打開一個文件只用于寫入。如果該文件已存在則打開文件,并從開頭開始編輯,即原有內容會被刪除。如果該文件不存在,創(chuàng)建新文件。
w+打開一個文件用于讀寫。如果該文件已存在則打開文件,并從開頭開始編輯,即原有內容會被刪除。如果該文件不存在,創(chuàng)建新文件。
wb+以二進制格式打開一個文件用于讀寫。如果該文件已存在則打開文件,并從開頭開始編輯,即原有內容會被刪除。如果該文件不存在,創(chuàng)建新文件。
a打開一個文件用于追加。如果該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會被寫入到已有內容之后。如果該文件不存在,創(chuàng)建新文件進行寫入。
ab以二進制格式打開一個文件用于追加。如果該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會被寫入到已有內容之后。如果該文件不存在,創(chuàng)建新文件進行寫入。
a+打開一個文件用于讀寫。如果該文件已存在,文件指針將會放在文件的結尾。文件打開時會是追加模式。如果該文件不存在,創(chuàng)建新文件用于讀寫。
ab+以二進制格式打開一個文件用于追加。如果該文件已存在,文件指針將會放在文件的結尾。如果該文件不存在,創(chuàng)建新文件用于讀寫。
  • 如果要打開的文件和當前py文件在同一目錄,那么使用相對路徑即可,否則使用絕對路徑。
  • 如果不指定編碼方式,默認使用操作系統(tǒng)當前的編碼,而不是使用python3的默認編碼utf-8。比如Windows下默認gbk編碼,而python3默認utf-8,如果不指定編碼方式打開文件,讀文件時解碼報錯。操作磁盤數(shù)據(jù)的時候一定要注意編碼方式,編碼和解碼使用同一種方式才不會報錯。
f = open(‘txt’, encoding=’utf-8) data = f.read() print(data) f.close()
  • 文件操作完之后要關閉,因為打開文件就相當于把文件內容從磁盤加載到內存中,如果不關閉,內存就會一直被占用。

  • 打開文件的權限 r w a 如果不指定默認讀權限打開文件

  • readlines() 可以打印出換行符,以列表形式讀出所有行。

  • 在讀文件的時候,會有一個指針指向讀到的位置,使用f.read()相當于全部讀完了,指針直接移到了文件末尾,再讀文件就讀不到內容了。

  • 如果僅以w寫模式打開文件,如果文件不存在則新建文件并打開;如果文件存在,則清空文件并打開。 — 得到的都是一個空文件。

  • 如果寫文件時需要換行,應手動添加 \n;

f.write() # 字符串形式寫 f.writelines() # 列表的形式寫
  • 在文件中,所有內容都是字符的形式(都是字符串),所以不管讀還是寫,都只能讀出或寫入字符串,不能寫入數(shù)字類型int。

  • ‘a’模式 – 追加寫的方式打開文件(可讀可寫)
    在文件末尾寫入數(shù)據(jù),正常情況下我們以w模式打開文件,指針是指在文件開始的位置,當我們寫入數(shù)據(jù)的時候就把原來文件頭部數(shù)據(jù)覆蓋了,而a模式打開可以在文件末尾追加。這里要注意,在文件最后的位置寫而不代表在文件最后一行寫入。

  • ‘x’模式: 只寫模式打開,不存在則創(chuàng)建,存在則報錯

  • 注意:文件沒有修改這一概念,只有覆蓋,磁盤上的文件是無法修改的,我們說的修改是指用新的數(shù)據(jù)覆蓋原來的數(shù)據(jù)。實際上,我們打開一個文件,操作系統(tǒng)會把文件加載到內存中,我們在內存中是可以修改文件內容的,修改完當我們保存到磁盤的時候,操作系統(tǒng)會用修改后的文件內容去覆蓋掉磁盤上原來的文件。我們在Linux中會有一個.swap交換文件,修改的文件實際上就是新建了個.swap文件,當保存文件的時候會用.swap文件覆蓋原來的文件。我們使用vim打開文件,實際上就是把文件加載到內存中去修改,當文件較大的時候,打開的會非常慢,而cat查看文件不同,它不會加載到內存,所以查看的速度很快。

  • with

二進制打開文件

  • rb wb – 以二進制的方式打開文件,只是以二進制方式處理文件,而不是說把文件改成二進制,在Linux中沒有影響,因為Linux中默認文件處理就是二進制方式。
  • 以二進制方式打開文件的時候,就不能指定編碼了,因為本身編碼解碼方式就是把字符解釋成二進制的方式,既然以二進制操作文件,就沒有所謂的編碼解碼了。
  • 通過rb讀文件時,讀出的都是二進制,中文字符都變成了十六進制表示的編碼,如果我們要看字符原來的樣子,我們可以使用.decode()方法進行解碼,得到字符,這里需要指定解碼方式,解碼方式必須和磁盤文件保存的編碼方式一致。
f = open(‘txt’, ‘rb’) data = f.read() print(data.decode(‘utf-8))
  • 通過’wb’寫文件,不能直接寫字符串,應該寫入二進制,而字符串要想變成二進制必須要經過編碼,所以在寫數(shù)據(jù)時要指定編碼方式,以二進制的形式寫入文件。
f = open(‘txt’, ‘wb’) f.write(bytes(‘hello’, encoding=’utf-8)) f.write(‘world’.encode(‘utf-8))
  • 為什么要用b的方式打開呢,一是因為open方法打開文件時還有個默認參數(shù)是t,也就是以文本的方式打開文件text,而很多其他類型的文件比如圖片視頻音頻,使用t的方式是處理不了的;二是因為二進制是可以跨平臺的,因為不管Windows還是Linux/Unix,所有文件最終都是二進制形式存儲的,所以二進制是可以跨平臺的。(Linux下默認就是二進制)

回車換行符

  • Windows下回車換行是 \r\n 兩個字符,通過open的b方式打開,通過read方法就可以讀出來。或者不通過b方式打開,在open中加一個newline=’’也可以顯示出 \r 字符,否則默認是看不到 \r 的,只能看到 \n。這是因為,我們的文件可能來自Linux、Windows等不同平臺,不同平臺的回車換行符是不一樣的,python會統(tǒng)一把回車換行轉換成 \n。newline=’’就表示告訴python,不要幫我轉換,就按照原來的樣子幫我打開。Linux下回車換行是 \n 一個字符。
#以下在都是Windows平臺,Linux平臺回車換行本來就是\n #看不到\r只能看到\n f = open(‘txt’, ‘r’, encoding=‘utf-8) print(f.readlines()) #可以看到\r\n f = open(‘txt’, ‘rb’) print(f.read ()) f = open(‘txt’, ‘r’, encoding=‘utf-8, newline=’’) print(f.readlines())

文件操作

  • .flush() 把內存中的數(shù)據(jù)刷新到磁盤
  • .tell() 當前讀寫的位置,讀寫位置指針、光標的位置,按字節(jié)計算
  • .seek() 移動讀寫位置,按字節(jié)的方式移動,默認從文件頭開始算
    只要不是read方法,其他方法對讀寫位置(光標)的移動都是以字節(jié)為單位,read是以字符的方式移動。
f.seek(2) #光標向下移動2個字節(jié) f.read(2) #讀取兩個字符(’你好’是兩個字符,utf-8編碼時占6字節(jié)) f.seek(20) print(f.tell()) #– f.tell() = 20 f.seek(3) print(f.tell()) #– f.tell() = 3,注意是3而不是23 #seek移動的字節(jié)數(shù)默認從文件頭開始算
  • seek有三種模式
seek(num,0) # 默認方式,絕對位置,相對于文件頭移動num字節(jié) seek(num,1) # 相對位置,相對于上一次光標位置移動num字節(jié) seek(-num,2) # 從文件尾部移動,從文件尾部往前移動num字節(jié)(要注意回車換行符\r\n),實際上就是倒著移動

需求:查看日志文件的最近一條記錄(最后一行)

f = open(‘log’, ‘rb’) data = f.readlines() print(data[-1].decode(‘utf-8)) #把整個文件讀成列表放入內存 – 耗用內存,效率低 f = open(‘log’, ‘rb’) #如何循環(huán)文件 # for i in f.readlines() #按行的方式把整個文件讀到內存 for i in f: #一次取一行,需要的時候才去取offs = -10while True:f.seek(offs, 2)data = f.readlines()if len(data) > 1: #列表長度大于1說明包含換行符,讀多了print(‘文件最后一行是%s’ %(data[-1].decode(‘utf-8)))breakoffs *= 2
  • 使用seek方法1、2的方式移動光標,必須要以二進制b的方式open打開文件,否則報錯。
  • .truncate() 截斷,是一種寫文件操作
f = open(‘txt’, ‘r+, encoding=‘utf-8, newline=’’) #可以通過r+, a+等等方式打開,只要保證有寫權限即可 #不能通過w或w+方式打開,因為w會把原文件清空,得到的是空文件 #截斷是一種寫操作,把原文件截斷為指定字節(jié)數(shù),截斷空文件沒有意義 f.truncate(10) #截取10字節(jié)



總結

以上是生活随笔為你收集整理的【Python编程】九、Python文件操作的全部內容,希望文章能夠幫你解決所遇到的問題。

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