檔案的讀寫
接著我們來談談怎麼透過檔案來執行輸入和輸出,要能夠讀寫檔案,我們需要以下步驟:
- 開啟檔案
- 讀取或寫入檔案
- 關閉檔案
我們先來看看如何開啟檔案,假設我們有一個檔案 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 會從原本檔案內容的結尾開始寫入