【Python编程】九、Python文件操作
歡迎關注博主 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ù)的時候一定要注意編碼方式,編碼和解碼使用同一種方式才不會報錯。
-
文件操作完之后要關閉,因為打開文件就相當于把文件內容從磁盤加載到內存中,如果不關閉,內存就會一直被占用。
-
打開文件的權限 r w a 如果不指定默認讀權限打開文件
-
readlines() 可以打印出換行符,以列表形式讀出所有行。
-
在讀文件的時候,會有一個指針指向讀到的位置,使用f.read()相當于全部讀完了,指針直接移到了文件末尾,再讀文件就讀不到內容了。
-
如果僅以w寫模式打開文件,如果文件不存在則新建文件并打開;如果文件存在,則清空文件并打開。 — 得到的都是一個空文件。
-
如果寫文件時需要換行,應手動添加 \n;
-
在文件中,所有內容都是字符的形式(都是字符串),所以不管讀還是寫,都只能讀出或寫入字符串,不能寫入數(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()方法進行解碼,得到字符,這里需要指定解碼方式,解碼方式必須和磁盤文件保存的編碼方式一致。
- 通過’wb’寫文件,不能直接寫字符串,應該寫入二進制,而字符串要想變成二進制必須要經過編碼,所以在寫數(shù)據(jù)時要指定編碼方式,以二進制的形式寫入文件。
- 為什么要用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 一個字符。
文件操作
- .flush() 把內存中的數(shù)據(jù)刷新到磁盤
- .tell() 當前讀寫的位置,讀寫位置指針、光標的位置,按字節(jié)計算
- .seek() 移動讀寫位置,按字節(jié)的方式移動,默認從文件頭開始算
只要不是read方法,其他方法對讀寫位置(光標)的移動都是以字節(jié)為單位,read是以字符的方式移動。
- seek有三種模式
需求:查看日志文件的最近一條記錄(最后一行)
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() 截斷,是一種寫文件操作
總結
以上是生活随笔為你收集整理的【Python编程】九、Python文件操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python程序基础知识(五)pytho
- 下一篇: websocket python爬虫_p