一文帶你搞懂Python文件讀寫

點擊上方“ Go語言進階學習 ”,進行關注

回覆“Go語言”即可獲贈從入門到進階共10本電子書

潯陽江頭夜送客,楓葉荻花秋瑟瑟。

大家好,我是Go進階者。今天給大家分享Python基礎之文件讀寫。

一、什麼是文件?

文件就是把一些存儲存放起來,可以讓程序下一次執行的時候直接使用,而不必重新制作一份,省時省力。


二、文件如何的打開?

Python內置了一個open()方法,可以對文件進行讀寫操作。

使用open()方法操作文件就像把大象塞進冰箱一樣,可以分三步走,一是打開文件,二是操作文件,三是關閉文件。

open語法

open()方法的返回值是一個file對象,可以將它賦值給一個變量(文件句柄)。

其基本語法格式爲:

f = open(filename, mode)

注:

Python中,所有具有read和write方法的對象,都可以歸類爲file類型。而所有的file類型對象都可以使用open方法打開,close方法結束。

filename:一個包含了你要訪問的文件名稱的字符串值,通常是一個文件路徑。

mode:打開文件的模式,有很多種,默認是隻讀方式r。

例:

# 打開一個文件f = open("1.txt", "w")f.write("Python 是一種非常好的語言。\nPython!!\n")# 關閉打開的文件f.close()

運行結果:

在1.txt文件中寫入Python 是一種非常好的語言。Python。

三、訪問模式

通過一個表格,瞭解Python常用的讀寫模式

訪問模式 說明
r 以只讀方式打開文件。文件的指針將會放在文件的開頭。(默認模式)。
w 打開一個文件只用於寫入。如果該文件已存在則將其覆蓋。如果該文件不存在,創建新文件。
a 打開一個文件用於追加。如果該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會被寫入到已有內容之後。如果該文件不存在,創建新文件進行寫入。
rb 以二進制格式打開一個文件用於只讀。文件指針將會放在文件的開頭。這是默認模式。
wb 以二進制格式打開一個文件只用於寫入。如果該文件已存在則將其覆蓋。如果該文件不存在,創建新文件。
ab 以二進制格式打開一個文件用於追加。如果該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會被寫入到已有內容之後。如果該文件不存在,創建新文件進行寫入。
r+ 打開一個文件用於讀寫。文件指針將會放在文件的開頭。
w+ 打開一個文件用於讀寫。如果該文件已存在則將其覆蓋。如果該文件不存在,創建新文件。
a+ 打開一個文件用於讀寫。如果該文件已存在,文件指針將會放在文件的結尾。文件打開時會是追加模式。如果該文件不存在,創建新文件用於讀寫。
rb+ 以二進制格式打開一個文件用於讀寫。文件指針將會放在文件的開頭。
wb+ 以二進制格式打開一個文件用於讀寫。如果該文件已存在則將其覆蓋。如果該文件不存在,創建新文件。
ab+ 以二進制格式打開一個文件用於追加。如果該文件已存在,文件指針將會放在文件的結尾。如果該文件不存在,創建新文件用於讀寫。

如果要讀取非UTF-8編碼的文件,需要給open()函數傳入encoding參數。

例如,讀取GBK編碼的文件:

>>> f = open('gbk.txt', 'r', encoding='gbk')>>> f.read()'GBK' #編碼

遇到有些編碼不規範的文件,可能會拋出UnicodeDecodeError異常,這表示在文件中可能夾雜了一些非法編碼的字符。遇到這種情況,可以提供errors參數,表示如果遇到編碼錯誤後如何處理。

f = open('gbk.txt', 'r', encoding='gbk', errors='ignore')


四、 文件對象操作

用open方法打開一個文件,將返回一個文件對象。這個對象內置了很多操作方法。

下面打開了一個f文件對象(1.txt)。對文件對象進行相關的操作。

1. f.read(size)

讀取一定大小的數據, 然後作爲字符串或字節對象返回。size是一個可選的數字類型的參數,用於指定讀取的數據量。當size被忽略了或者爲負值,那麼該文件的所有內容都將被讀取並且返回。

f = open("1.txt", "r")
str = f.read()print(str)
f.close()

如果文件體積較大,請不要使用read()方法一次性讀入內存,而是read(312)這種一點一點的讀。

2. f.readline()

從文件中讀取一行n內容。換行符爲'\n'。如果返回一個空字符串,說明已經已經讀取到最後一行。這種方法,通常是讀一行,處理一行的情況下使用。

f = open("1.txt", "r")str = f.readline()print(str)f.close()

3. f.readlines()

將文件中所有的行,一行一行全部讀入一個列表內,按順序一個一個作爲列表的元素,並返回這個列表。readlines方法會一次性將文件全部讀入內存,所以也存在一定的弊端。但是它有個好處,每行都保存在列表裏,可隨意存取。

f = open("1.txt", "r")a = f.readlines()print(a)f.close()

4. 遍歷文件

實際情況中,我們會將文件對象作爲一個迭代器來使用。

# 打開一個文件f = open("1.txt", "r")
for line in f: print(line, end='')
# 關閉打開的文件f.close()

這個方法很簡單, 不需要將文件一次性讀出,但是同樣沒有提供一個很好的控制,與readline方法一樣只能前進,不能回退。

幾種不同的讀取和遍歷文件的方法比較:

如果文件很小,read()一次性讀取最方便;

如果不能確定文件大小,反覆調用read(size)比較保險;

如果是配置文件,調用readlines()最方便。普通情況,使用for循環更好,速度更快。

5. f.write()

使用write()可以完成向文件寫入數據。

# 打開一個文件f = open("/tmp/foo.txt", "w")
f.write("Python 是一種非常好的語言。\n我喜歡Python!!\n")
# 關閉打開的文件f.close()

6. f.tell()

返回文件讀寫指針當前所處的位置,它是從文件開頭開始算起的字節數。一定要注意了,是字節數,不是字符數。

7. f.seek()

如果要改變位置指針的位置, 可以使用f.seek(offset, from_what)方法。seek()經常和tell()方法配合使用。

from_what的值,如果是0表示從文件開頭計算,如果是1表示從文件讀寫指針的當前位置開始計算,2表示從文件的結尾開始計算,默認爲0,例如:

offset:表示偏移量。

  • seek(x,0) :從起始位置即文件首行首字符開始移動 x 個字符。

  • seek(x,1) :表示從當前位置往後移動x個字符。

  • seek(-x,2):表示從文件的結尾往前移動x個字符。

例:

f = open("1.txt", "rb+")f.write(b"1232312adsfalafds")
print(f.tell())

print(f.seek(5))
print(f.read(1))
print(f.seek(-3, 2))
print(f.read(1))

運行結果:


8. f.close()

關閉文件對象。當處理完一個文件後,調用f.close()來關閉文件並釋放系統的資源。文件關閉後,如果嘗試再次調用該文件對象,則會拋出異常。忘記調用close()的後果是數據可能只寫了一部分到磁盤,剩下的丟失了,或者更糟糕的結果。


五、 with關鍵字

with關鍵字用於Python的上下文管理器機制。爲了防止open這一類文件打開方法,在操作過程出現異常或錯誤,或者最後忘了執行close方法,文件非正常關閉等可能導致文件泄露、破壞的問題。

Python提供了with這個上下文管理器機制,保證文件會被正常關閉。不需要再寫close語句。注意縮進。

with open('test.txt', 'w') as f:    f.write('Hello, world!')

with支持同時打開多個文件(文件都是隨機創建的):

with open('1') as obj1, open('2','w') as obj2:    s=obj1.read()    obj2.write(s)


六、總結

本文基於Python基礎,使用Python語言。介紹了有關Python文件操作的知識點,從文件的基本概念入手 ,通過一個個小項目的演示,對常用的讀寫模式,文件對象操作方法,以及在實際應用中需要注意的問題,都做了詳細的講解。希望幫助你更好的學習Python。


------------------- End -------------------

往期精彩文章推薦:

歡迎大家點贊,留言,轉發,轉載,感謝大家的相伴與支持

想加入Go學習羣請在後臺回覆【入羣

萬水千山總是情,點個【在看】行不行

本文分享自微信公衆號 - Go語言進階學習(gh_dced3d6523fb)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章