18 Python如何操作檔案?

救苦救难韩天尊發表於2024-09-10

本篇是 Python 系列教程第 18 篇,更多內容敬請訪問我的 Python 合集

1 開啟檔案

通常使用內建的 open(檔案路徑, 模式, encoding="utf-8")函式。

  • 檔案路徑:可以是相對路徑或絕對路徑。
  • 模式:(可選)決定了檔案開啟後如何處理檔案。
  • encoding:(可選)編碼方式。

常見的模式有:

  • 'r' (預設):只讀模式,如果檔案不存在,則會引發 FileNotFoundError。
  • 'w':寫入模式,如果檔案存在則會清空內容再寫入,如果檔案不存在則建立新檔案。
  • 'a':追加模式,在檔案末尾追加內容,如果檔案不存在則建立新檔案。
  • 'b':二進位制模式,用於處理二進位制檔案(如影像、音訊等)。
  • '+':更新模式,用於同時進行讀寫操作。

可以將這些模式組合起來使用,例如:

  • 'rb':以二進位制模式讀取檔案。
  • 'wb':以二進位制模式寫入檔案。
  • 'ab':以二進位制模式追加內容到檔案。
  • 'r+':讀寫模式,可以讀取和寫入檔案。
  • 'w+':寫入並讀取模式,先寫入後讀取。
  • 'a+':追加並讀取模式,先追加後讀取。

2 檔案讀取

如果open()函式執行成功,會返回一個檔案物件。後續可以對這個物件進行讀取或寫入操作。

f = open('./data.txt', 'r', encoding='utf-8')

檔案物件有個read()方法,會一次性讀取檔案裡的所有內容,並返回字串格式。

例項:

file = open('data.txt', 'r', encoding="utf-8")
print(file.read())

注意:

  • 如果呼叫過read()後再次呼叫,會返回空,因為程式會記錄檔案被讀取的位置,第一次read()時已經讀到檔案末尾,第二次read()後面就沒有內容了。
  • 大檔案也不適合用read(),因為會一次性讀取檔案的所有內容,可能擠爆記憶體。

上面說大檔案不適合用read(),那有別的替換方案嗎?當然有,解決方案就是一次性只讀取部分內容,如:

  • read()傳一個數字引數如read(1024),表示一次讀多少位元組,下次再呼叫read(1024)時就會繼續從上次的結束位置讀取。
  • 使用readline(),此方法一次只會讀取一行內容,是根據換行符來判斷本行結尾的,而且換行符也會被當做內容的一部分被讀取。

上面的兩種方式可搭配while迴圈來用,另外還有一個readlines()方法,會一次性返回所有行,組成一個字串列表,一般搭配for迴圈使用。

3 檔案寫入

呼叫open()函式時第二個引數傳wa就可以進行檔案寫入操作。這裡說明一點,如果第二個引數是r,且檔案不存在就會報FileNotFoundError錯誤,但是wa就不會報錯,它會自動建立一個檔案。

在開啟或建立檔案之後就可以呼叫檔案物件的write()方法進行寫入操作了。

示例:

with open('data.txt', 'w', encoding="utf-8") as file:
    file.write("hello ")
    file.write("python")

data.txt內容:

hello python

注意write()方法並不會自動換行,需要手動新增換行符,如把程式碼改成file.write("hello\n"),data.txt就會變成:

hello
python

如果我們使用w模式,檔案就只能寫入不能讀取,如果我們想先讀取再寫入,可以用r+模式

4 關閉檔案

檔案操作完畢後,檔案物件需要呼叫一個close()方法關閉檔案釋放資源。

每次檔案操作完畢後都應該關閉檔案,但是有可能會粗心忘記關閉,怎麼辦呢?我們可以在呼叫open()函式開啟檔案的時候使用with關鍵字,然後用as指定讀取到的檔案,這樣在with程式碼塊執行完後檔案就會被自動關閉了,例項:

# 使用 with 語句來讀取檔案
with open('data.txt', 'r', encoding='utf-8') as file:
    for line in file.readlines():
        print(line.strip())

相關文章