這個主題考什麼
- 根據任務選擇 r、w、a 和二進位模式。
- 使用 with 塊,讓檔案在出錯時也能關閉。
- 讀取行和寫入文字時,不丟失換行符。
常見錯誤
- 想追加卻用了 w,結果把原檔案截斷。
- 內容不是 ASCII 時,打開文字檔卻不指定編碼。
- 忘記 readlines 會在每一行末尾保留換行符。
範例題
從完整題庫中挑出的 10 道代表題。先自己作答,再展開答案。
-
1. 小明寫訂單到檔案 open("訂單.txt", "w"),"w" 表示什麼?
顯示答案
答案
B. 寫入(覆蓋原內容)解析: w 在 open 執行時就截斷檔案,舊流水在第一行寫入前已經清空;要保留舊內容只能改用 a,否則每次打開都從零開始。
-
2. 小明寫下一行後,用另一個程式打開同一檔案卻看不到內容。哪個呼叫能把緩衝刷進磁碟?
顯示答案
答案
A. f.flush()解析: write() 只是把文字放進行程緩衝;flush() 才交給作業系統,在那之前別的程式看不到。close() 也會刷新,但只在塊結束那一刻。
-
3. 哪種結構能在程式碼區塊內發生例外時仍然關閉檔案?
顯示答案
答案
B. with 語句解析: 這裡只有 with 塊綁定了清理動作:例外還在傳播時,__exit__ 就會呼叫 close(),迴圈和 match 都不管這個。
-
4. f.read() 和 f.readlines() 的主要區別是?
顯示答案
答案
B. 前者回傳整段字串,後者回傳行串列解析: read() 把全文作為一個字串回傳;readlines() 按換行切分且保留換行符,回傳串列,readline() 只取一行。
-
5. 小明讀寫中文選單檔案,為防亂碼要指定 open(..., encoding=___)
顯示答案
答案
utf-8解析: 不寫 encoding 會用平臺預設值,Windows 上常是 GBK;顯式寫 utf-8 才按寫入時的位元組解碼。
-
6. 在檔案末尾追加內容,模式填什麼?
with open('orders.txt', '____', encoding='utf-8') as f: f.write('new\n')顯示答案
答案
a解析: a 在末尾追加,之前的訂單得以保留。w 會先清空,r 不允許寫入。 檔案不存在時 a 會新建,第一次追加不用特殊處理。
-
7. 在資料行之前先寫表頭,空裡填哪個方法?
writer = csv.DictWriter(f, fieldnames=['name', 'price']) writer.____()顯示答案
答案
writeheader解析: writeheader() 把 fieldnames 寫成第一行。不寫的話檔案從資料開始,之後 DictReader 會把第一條資料當表頭。
-
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. 記憶體檔案裡有兩行小票,讀取後行數是多少?
import io f = io.StringIO('拿鐵,18\n美式,15\n') print(len(f.readlines()))顯示答案
答案
2解析: readlines() 每個以換行結尾的行算一項,'latte,18\n' 與 'americano,15\n' 共 2 項。 readlines() 還會把整個檔案讀進記憶體,日誌變大後要留意。
-
10. 寫入記憶體檔案後讀出的內容是什麼?
import io f = io.StringIO() f.write('拿鐵,18') print(f.getvalue())顯示答案
答案
拿鐵,18解析: StringIO 把寫入的文字留在行程裡,不落磁碟;getvalue() 原樣回傳,也不加換行,單元測試裡很好用。
常見問題
為什麼用 with open 而不是手動 open 和 close?
with 塊會自動關閉檔案,即使塊內發生例外也會關閉。
w 模式會對已有檔案做什麼?
它會先截斷檔案。要追加用 a;要更新但不截斷可以用 r+。
繼續保持練習節奏。
完整題庫會在這個瀏覽器裡記住進度,支援依主題篩選,並包含每日一題和錯題重練。