Python 程式設計

第 13 章    檔案

∗ 檔案

▸ 一序列的資料存在輔助記憶體 (Secondary memory) 中

▸ 文字檔:一序列的字串組成,斷行字元為 \n

▸ 例如,建立 ch14/hello.txt 檔案,並輸入以下資料:

Hello
World

Good morning
✶ 儲存在記憶體的內容為 'Hello\nWorld\n\nGood morning\n'

(1) 開啟與關閉文字檔案

∗ 開啟檔案

<file> = open(<filename>, <mode>)

<file>:所開啟的檔案物件

<filename>:檔名

<mode>:開檔模式

'r':讀取 (read)
'w':寫入 (write)

▸ 例如:

infile = open('hello.txt', 'r')    # 以讀取模式開檔
outfile = open('hello.txt', 'w')   # 以寫入模式開檔 

∗ 關閉檔案

<file>.close()

▸ 例如:

infile.close()

∗ 利用 with 指令開啟檔案 (建議一律使用此方式)

with open(<filename>, <mode>) as <file>:
    ...

▸ 例如:

with open('hello.txt', 'r') as infile:

▸ 優點:

✶ 檔案會自動關閉,不需要撰寫 .close() 指令
✶ 即使出現以下狀況,檔案仍會自動關閉:
# 發生例外
# 因為執行 return, coninue, break 等指令而跳出 with 本體指令區塊

(2) 讀取與寫入文字檔案

∗ 讀取檔案資料

▸ 讀檔方式:

<file>.read()         # 讀取全部 (或剩餘) 資料,結果為一個長字串
<file>.readline()     # 讀取下一行資料,結果為一個字串
<file>.readlines()    # 讀取全部 (或剩餘) 資料,結果為一個串列,每個元素都是一行資料

▸ 讀取全部資料,例如 ch14/read.py

with open('hello.txt', 'r') as infile:
    data = infile.read()
    print(type(data))
    print(data)
<class 'str'>
Hello
World

Good morning

▸ 利用迴圈一次讀一行資料,例如 ch14/whileRead.py

with open('hello.txt', 'r') as infile:
    while True:
        line = infile.readline()     # 一次讀一行資料
        if not line:                 # 所有資料讀取完畢
            break
        print(line, end='')          # end='': 不要自動加斷行

▸ 一次讀取多行資料,例如 ch14/listRead.py

with open('hello.txt', 'r') as infile:
    for line in infile.readlines():    # 一次讀取所有資料,再一行一行處理
        print(line, end='')

▸ 其實 Python 讀檔原本就是將每行資料存到串列中的元素,因此 ch14/listRead.py 可簡化為:

with open('hello.txt', 'r') as infile:
    for line in infile:
        print(line, end='')

∗ 寫入檔案資料

<file>.write(<...>)

▸ 例如讀入某檔,加上額外一行,再寫入另一檔:ch14/writeFile.py

with open('hello.txt', 'r') as infile:
    data = infile.read()

with open('output.txt', 'w') as outfile:
    outfile.write('Add one more line.\n')
    outfile.write(data)
output.txt
Add one more line.
Hello
World

Good morning

∗ 範例:讀取使用者資料,批次建立使用者名稱

▸ 使用者資料檔 ch14/usernames.txt 如下:

Steve Jobs
Bill Gates
Lawrence Page
Sergey Brin
Jeffrey Bezos
Mark Zuckerberg

▸ 以批次方式建立使用者名稱之檔案,使用者名稱為名字的第一個字母加上姓 (最多取 7 個字母)

ch14/usernames.py
with open('usernames.txt', 'r') as infile:
    with open('unames.txt', 'w') as outfile:
        for line in infile:
            first, last = line.split()
            uname = (first[0]+last[:7]).lower()
            outfile.write(uname + '\n')
        print('Done.')
ch14/unames.txt
sjobs
bgates
lpage
sbrin
jbezos
mzuckerb

上一章       下一章