檔案的讀寫

接著我們來談談怎麼透過檔案來執行輸入和輸出,要能夠讀寫檔案,我們需要以下步驟:

  1. 開啟檔案
  2. 讀取或寫入檔案
  3. 關閉檔案

我們先來看看如何開啟檔案,假設我們有一個檔案 test_file 內容如下:

Hello world
Today is a good day!

我們用簡單的幾行 code 就能完成讀取檔案:

f = open('test_file')
print(f.readline())
print(f.readline())
f.close()

open / close 函式

open 函數需要一個檔名字串作為參數,當我們指定了 test_file,Python 便會打開該檔,並且產生一個檔案物件,目前我們讓 f 參照這個檔案物件。

另外要提醒讀者的是,如果 open 函式只有指定檔名,那預設開啟後是讀取模式,如果使用寫入模式,那我們需要另外用參數來指定,這會在稍後提到。

下一步,我們可以用 readline() 方法來讀取一行,記得,他跟 input一樣,所讀取的任何資料都會被當成字串。

這邊我們之所以讀取兩次,是因為原本的檔案裡有兩行。

而最後利用 close 方法來關閉檔案。我們一定要記得在使用完檔案之後關檔,否則會讓該檔案佔住記憶體的空間,也可能會導致不可預期的錯誤。

執行的結果如下:

hello world

today is a good day

也許這跟讀者的預期不同,原因是當我們讀取檔案中的每一行時,會連同結尾的換行符號 \n 一起讀到,加上 print 預設的換行,就多出了我們看到的中間的空白行,其實我們對於字串可以用 strip 方法來清除字串頭尾一些非必要的字元:

f = open('test_file')
print(f.readline().strip())
print(f.readline().strip())
f.close()

seek 方法

另外一個可以討論的點是,如果我要回頭去讀取前面的行,我們可以用seek方法:

f = open('test_file')
print(f.readline().strip())
print(f.readline().strip())
f.seek(0)
print(f.readline().strip())
f.close()

我們利用 seek 將檔案物件讀取的位置移到第一行(其實是第零行),再一次的讀取後,我們可以再度讀到 'hello world'

可迭代的檔案物件

有一個問題是,有的時候我們並不知道檔案的行數,當我必須要遍讀全部的檔案時會有點麻煩,但是告訴大家一個好消息,for 迴圈可以應用在檔案物件上:

f = open('test_file')
for line in f:
    print(line.strip())
f.close()

透過 for,我們會迭代檔案中的每一行,這讓我們可以輕易地遍讀檔案。

環境管理器

Python有一個功能是環境管理器,我們可以透過with as敘述來簡化我們的檔案讀寫:

with open('test_file') as f:
    for line in f:
        print(line.strip())

使用這種手法,我們將可以忽略檔案關閉,因為一旦離開 with 的 suite,檔案就會自動被關閉了。

寫入模式與附加模式

那我們要如何寫檔呢?只要在 open 函式內更改開啟的模式參數即可,同時,我們需要在 print 函式中指定檔案物件作為 file 參數的值:

lst = ["第一行""第二行"]
with open('test_file', 'w') as f:
    for line in lst:
        print(line, file=f) # 利用 file 指定要寫入的檔案

沒錯,就那麼簡單!

使用 open 的第二個參數可以指定檔案存取的模式:

  • "r" 是讀取模式: 這也是 open 檔案模式的預設值
  • "w" 是寫入模式: Python 會清空原本檔案中的內容並從頭開始寫入
  • "a" 是附加模式: Python 會從原本檔案內容的結尾開始寫入

results matching ""

    No results matching ""