處理資料 · 10 道範例題

Python 檔案讀寫練習題與答案

檔案題獎勵精確。模式決定檔案是讀取、覆蓋還是追加;with 塊決定它是否關閉;編碼決定非 ASCII 文字能否保留。

38 道題在完整題庫中 · 19 道選擇 · 15 道填空 · 4 道輸出

這個主題考什麼

  • 根據任務選擇 r、w、a 和二進位模式。
  • 使用 with 塊,讓檔案在出錯時也能關閉。
  • 讀取行和寫入文字時,不丟失換行符。

常見錯誤

  • 想追加卻用了 w,結果把原檔案截斷。
  • 內容不是 ASCII 時,打開文字檔卻不指定編碼。
  • 忘記 readlines 會在每一行末尾保留換行符。
範例題

範例題

10

從完整題庫中挑出的 10 道代表題。先自己作答,再展開答案。

  1. 選擇題q0899

    1. 小明寫訂單到檔案 open("訂單.txt", "w"),"w" 表示什麼?

    1. 讀取(預設模式)
    2. 寫入(覆蓋原內容)
    3. 追加(保留原內容)
    4. 唯讀(不能寫)
    顯示答案

    答案

    B. 寫入(覆蓋原內容)

    解析: w 在 open 執行時就截斷檔案,舊流水在第一行寫入前已經清空;要保留舊內容只能改用 a,否則每次打開都從零開始。

  2. 選擇題q0906

    2. 小明寫下一行後,用另一個程式打開同一檔案卻看不到內容。哪個呼叫能把緩衝刷進磁碟?

    1. f.flush()
    2. f.seek(0)
    3. f.read()
    4. f.close(flush=True)
    顯示答案

    答案

    A. f.flush()

    解析: write() 只是把文字放進行程緩衝;flush() 才交給作業系統,在那之前別的程式看不到。close() 也會刷新,但只在塊結束那一刻。

  3. 選擇題q0913

    3. 哪種結構能在程式碼區塊內發生例外時仍然關閉檔案?

    1. for 迴圈
    2. with 語句
    3. match 語句
    4. lambda
    顯示答案

    答案

    B. with 語句

    解析: 這裡只有 with 塊綁定了清理動作:例外還在傳播時,__exit__ 就會呼叫 close(),迴圈和 match 都不管這個。

  4. 選擇題q0918

    4. f.read() 和 f.readlines() 的主要區別是?

    1. 兩者完全一樣
    2. 前者回傳整段字串,後者回傳行串列
    3. 後者會自動關閉檔案
    4. 前者只能讀二進位
    顯示答案

    答案

    B. 前者回傳整段字串,後者回傳行串列

    解析: read() 把全文作為一個字串回傳;readlines() 按換行切分且保留換行符,回傳串列,readline() 只取一行。

  5. 填空題q0901

    5. 小明讀寫中文選單檔案,為防亂碼要指定 open(..., encoding=___)

    顯示答案

    答案

    utf-8

    解析: 不寫 encoding 會用平臺預設值,Windows 上常是 GBK;顯式寫 utf-8 才按寫入時的位元組解碼。

  6. 填空題q0921

    6. 在檔案末尾追加內容,模式填什麼?

    with open('orders.txt', '____', encoding='utf-8') as f:
        f.write('new\n')
    顯示答案

    答案

    a

    解析: a 在末尾追加,之前的訂單得以保留。w 會先清空,r 不允許寫入。 檔案不存在時 a 會新建,第一次追加不用特殊處理。

  7. 填空題q0928

    7. 在資料行之前先寫表頭,空裡填哪個方法?

    writer = csv.DictWriter(f, fieldnames=['name', 'price'])
    writer.____()
    顯示答案

    答案

    writeheader

    解析: writeheader() 把 fieldnames 寫成第一行。不寫的話檔案從資料開始,之後 DictReader 會把第一條資料當表頭。

  8. 輸出預測q0900

    8. pathlib 拆路徑,三個屬性分別是什麼?

    from pathlib import Path
    p = Path("data/orders.csv")
    print(p.name, p.suffix, p.parent)
    顯示答案

    答案

    orders.csv .csv data

    解析: Path 只切字串不碰磁碟:name 是帶後綴的檔名,suffix 含點號,parent 是 data。

  9. 輸出預測q0930

    9. 記憶體檔案裡有兩行小票,讀取後行數是多少?

    import io
    f = io.StringIO('拿鐵,18\n美式,15\n')
    print(len(f.readlines()))
    顯示答案

    答案

    2

    解析: readlines() 每個以換行結尾的行算一項,'latte,18\n' 與 'americano,15\n' 共 2 項。 readlines() 還會把整個檔案讀進記憶體,日誌變大後要留意。

  10. 輸出預測q0931

    10. 寫入記憶體檔案後讀出的內容是什麼?

    import io
    f = io.StringIO()
    f.write('拿鐵,18')
    print(f.getvalue())
    顯示答案

    答案

    拿鐵,18

    解析: StringIO 把寫入的文字留在行程裡,不落磁碟;getvalue() 原樣回傳,也不加換行,單元測試裡很好用。

常見問題

為什麼用 with open 而不是手動 open 和 close?

with 塊會自動關閉檔案,即使塊內發生例外也會關閉。

w 模式會對已有檔案做什麼?

它會先截斷檔案。要追加用 a;要更新但不截斷可以用 r+。

繼續保持練習節奏。

完整題庫會在這個瀏覽器裡記住進度,支援依主題篩選,並包含每日一題和錯題重練。

開啟完整練習