文字檔案處理 ECCH7

由「讀入」到「整理」再到「輸出」:用 Python 處理文字檔案、CSV 與 JSON,並建立可重用的資料流程。

導入 你將會學到什麼?

在真實的程式開發中,資料往往不是「直接在程式內寫死」,而是儲存在不同的檔案之中,例如:

本章以「輸入-處理-輸出周期」為主線:先從檔案讀入資料(輸入),再用程式整理與計算(處理),最後輸出成新的檔案或報告(輸出)。

提醒:在瀏覽器網頁中直接讀寫本機檔案會受安全限制;但在 Python(本機執行環境)中,文字檔案處理是最常用的基本能力之一。理解本章後,你也更容易明白「網頁上傳檔案 → 伺服器處理 → 下載結果」的運作方式。

課題 1 檔案與資料格式:文字檔案、CSV、JSON

重點

教學:在 Python 寫入文字檔案(建立示例資料)

寫入文字檔案的基本流程是:以 with open(...) 開啟檔案(常用 w 覆蓋寫入)、指定 encoding="utf-8",再逐行寫入並自行加入換行符號 \\n

lines = ["Amy 78", "Ben 92", "Cathy 85"]
with open("scores.txt", "w", encoding="utf-8") as f:
    for line in lines:
        f.write(line + "\n")
若需要輸出為 CSV 或 JSON,本質上也是寫入文字檔案;分別只是內容的規則(定界符號或結構語法)不同。

當你面對一個「資料檔案」,第一步不是立即寫程式,而是先判斷資料的結構:是自由文字?是表格?還是有巢狀的欄位?結構越清晰,你寫出的算法就越簡潔,也更不容易出錯。

文字檔案最彈性,但也最容易「規則不一」。CSV 對表格非常友好,適合快速整理與統計。JSON 則適合保存更複雜的資料,例如「題目」包含「選項陣列」、「答案」與「解釋」等多層資料。

在本章的後續課題,你會先學會如何讀寫文字檔案,再逐步把讀入的內容轉成「陣列」或其他資料結構,最後輸出成你需要的格式。

為何應從文字檔案讀取資料?

Python 練習

以下練習提供「檔案檢視器」,以左右兩欄顯示文本檔案原本目前內容。你可直接在右欄修改檔案內容,再執行程式觀察結果;如需還原,請按「重設文本檔案」。

Check Point 1小測:辨認資料格式
(按「下一題」開始)

課題 2 讀取文字檔案:逐行讀取與資料清洗

重點

教學:在 Python 寫入文字檔案(輸出清洗後的結果)

讀取檔案後通常要清洗資料(例如去除空白與空行)。最簡潔的做法是「邊讀邊寫」:讀入一行就清洗一行,並立即寫到新檔案。

with open("raw.txt", "r", encoding="utf-8") as fin, \
     open("clean.txt", "w", encoding="utf-8") as fout:
    for line in fin:
        s = line.strip()
        if s:
            fout.write(s + "\n")
這種做法能避免一次讀入整個檔案造成記憶體壓力,同時把資料處理流程保留在輸出檔案中。

處理文字檔案時,最常見的資料單位是「一行」。一行可能代表一條記錄(例如一位同學),也可能代表一個設定(例如 theme=dark)。因此,逐行讀取通常最自然:你可以在每次讀到一行時立即清洗與解析。

在讀入資料之後,請先把「非資料」清走,例如多餘空白、換行、空行,然後再把內容轉成你需要的資料結構,例如把每行拆成欄位,再放入陣列。這樣做的好處是:後面的計算與輸出會更穩定,較少出現「資料長度不一致」的錯誤。

良好的讀取策略也與檔案大小有關。小檔案用 read() 可以快速完成;大檔案建議逐行處理,讓程式保持流暢並降低記憶體壓力。

Python 練習:開啟檔案與讀取方法

本節會透過多個練習,讓你比較 read()readline()readlines() 在「文字檔案串流(text file stream)」中的行為差異。

Check Point 2小測:讀取方法的選擇
(按「下一題」開始)

課題 3 檔案開啟模式(WAX):w/a/x 的用途與差異

重點

教學:WAX 模式快速比較(w 覆寫、a 附加、x 建立新檔)

選擇正確的開啟模式非常重要:

# w:覆寫(會清空原內容)
with open("report.txt", "w", encoding="utf-8") as f:
    f.write("班別:3A\n")
    f.write("平均分:78.5\n")

# a:附加(保留原內容,從檔尾加入)
with open("log.txt", "a", encoding="utf-8") as f:
    f.write("2026-01-08 18:30 完成統計\n")

# x:建立新檔(已存在會報錯,避免覆蓋)
try:
    with open("new_report.txt", "x", encoding="utf-8") as f:
        f.write("第一次建立成功\n")
except FileExistsError:
    print("檔案已存在:請改用 w 或 a")
如需自動換行,也可使用 print(..., file=f);但若要嚴格控制格式(例如 CSV),建議使用 write()

當你完成資料整理與計算之後,若只把結果顯示在畫面上,資料很容易在關閉程式後消失。把結果輸出成檔案,等於為你的處理流程加上「可保存」與「可追蹤」的能力。

寫入時,最需要小心的是檔案模式w 會覆蓋舊內容,適合生成全新報告;a 會附加內容,適合記錄日誌或追加紀錄;x 只在檔案不存在時建立新檔,用於避免不小心覆蓋舊資料。只要模式選對,你的輸出就會更符合需要。

另外,輸出格式應該「為下一步服務」。例如你要把報告再匯入試算表,就用 CSV;若要讓另一個程式讀取,就考慮 JSON;若只求易讀,就輸出成文字報告。

Python 練習:WAX 模式(先 w,再 a,再 x)

本部分練習會依序安排:w 示範 → w 練習 → a 示範 → a 練習 → x 示範 → x 練習。建議你先執行示範題觀察效果,再在練習題中補上少量程式碼,完成同類型操作。

Check Point 3小測:寫入與附加(概念選擇題)
(按「下一題」開始)

課題 4 CSV 處理:由文字到表格資料

重點

教學:在 Python 寫入文字檔案(輸出 CSV)

輸出 CSV 時建議使用 csv 模組,並在開檔時加入 newline=""(特別是在 Windows)以避免多餘空行。

import csv

rows = [
    ["name", "score"],
    ["Amy", 78],
    ["Ben", 92],
]

with open("scores.csv", "w", encoding="utf-8", newline="") as f:
    w = csv.writer(f)
    w.writerows(rows)
輸出時請保持欄位順序一致,並確保數值已轉成合適的型態或字串格式。

CSV 的優勢在於它非常像表格:每行是一筆記錄,每個欄位都對應到清楚的意義。你可以先用最基本的拆分方式理解其運作,然後再進一步使用標準模組處理更複雜的情況。

當你把 CSV 解析成陣列或其他資料結構後,就可以把「檔案」問題轉成「資料結構」問題:例如對分數做排序法、找最高最低、計算平均數或中位數。這也是把資料處理流程變得可重用的關鍵。

真正困難的部分往往不是公式,而是資料品質。你需要在解析時加入有效性檢驗:例如欄位是否足夠、分數是否為數字、是否在合理範圍。這會在課題 6 進一步討論。

Python 練習:資料處理(搜尋/分拆/替換/篩選)

本節練習會使用文字處理技巧(例如 splitreplace、條件篩選),並示範若要把處理結果寫回檔案,必須以合適模式重新開啟檔案。

Check Point 4小測:CSV 解析概念
(按「下一題」開始)

課題 5 JSON 處理:結構化資料的讀寫

重點

教學:在 Python 寫入文字檔案(輸出 JSON)

輸出 JSON 時可用 json.dump() 直接寫入檔案,並配合 ensure_ascii=False 保留中文、indent 令檔案更易讀。

import json

data = [
    {"name": "Amy", "score": 78},
    {"name": "Ben", "score": 92},
]

with open("scores.json", "w", encoding="utf-8") as f:
    json.dump(data, f, ensure_ascii=False, indent=2)
若你要輸出到網路或除錯,也可改用 json.dumps() 先取得字串,再按需要寫入檔案。

JSON 的價值在於「結構」。當資料不再只是兩欄三欄的表格,而是每筆資料都有多個屬性,甚至包含另一個陣列(例如選項列表),JSON 會比 CSV 更容易表達,也更容易擴充。

在處理 JSON 時,做法往往是:先把 JSON 讀入成資料結構,再使用算法逐步操作,例如遍歷陣列、用鍵取值、篩選、統計與重組。當你能熟練這套流程,就能把「題庫小測」、「設定檔」、「簡易資料庫」等需求快速實作。

輸出 JSON 時,建議使用縮排(例如 indent=2)以提升可讀性。這不會影響程式讀取,但會令你和同學在檢查檔案時更容易找到問題。

Python 練習:讀寫 JSON(查詢/更新/刪除紀錄)

你將把 JSON 檔案讀入為 list / dict,完成查詢統計、更新指定 id,以及刪除指定紀錄後寫回檔案。

Check Point 5小測:JSON 基本操作
(按「下一題」開始)

課題 6 有效性檢驗與異常處理:讓程式更可靠

重點

教學:在 Python 寫入文字檔案(錯誤記錄 log)

可靠的程式會把錯誤「說清楚、記下來」。遇到例外時可把錯誤訊息附加寫入 log 檔,方便日後追查與修正資料。

try:
    score = int("abc")  # 示意:可能失敗的轉型
except ValueError as e:
    with open("error.log", "a", encoding="utf-8") as f:
        f.write(f"[ValueError] {e}\n")
記錄時可加入行號、原始內容與欄位資訊,讓錯誤具備可追蹤性。

現實世界的資料往往不完美。即使同一份表格,也可能出現漏填、手誤、格式不一致等問題。因此,寫出「能跑」的程式只是第一步;更重要的是寫出「遇到壞資料也不會崩潰」的程式。

有效性檢驗的重點是先定規則:例如分數一定是整數、範圍是 0–100、每行至少兩欄。當規則清楚,你就能在讀入後立刻檢查,並決定如何處理:跳過、修正、或終止。

異常處理則是在程式執行中提供「安全網」。遇到檔案不存在、轉換失敗等情況時,程式不應直接終止,而應給出清晰訊息,讓使用者知道下一步怎樣做。

Python 練習:資料驗證與例外處理

本節練習會加入不完整或不合理資料,讓你練習以 try...except 處理錯誤,並以規則驗證後再寫入檔案。

Check Point 6小測:有效性檢驗與異常處理
(按「下一題」開始)

課題 7 迷你專題:成績報告(CSV → 統計 → 輸出)

重點

教學:在 Python 寫入文字檔案(輸出成績報告)

完成統計後可把結果輸出成報告檔。建議在報告中清楚列出來源、時間與統計方法,並以固定格式逐行寫入。

from datetime import date

with open("report.txt", "w", encoding="utf-8") as f:
    f.write(f"生成日期:{date.today()}\n")
    f.write("班別:3A\n")
    f.write("平均分:78.5\n")
    f.write("最高分:96\n")
如需同時給程式再處理,可另外輸出 CSV 或 JSON 摘要檔,形成「人讀 + 機讀」雙輸出。

專題的目標不是把所有功能一次做完,而是建立一條「可持續擴充」的資料流程。先做到最基本的版本:讀入、計算平均分、輸出報告;然後再加入錯誤清單、等級判斷、排序法、分佈統計等功能。

當你能把流程拆成清晰的步驟,你就能很自然地把每一步變成子程式,令程式更易測試與除錯,也更容易與同學分工。

下一課題會把 JSON 題庫應用在「題庫小測」專題,並示範如何把作答結果輸出為檔案,形成一個完整的輸入-處理-輸出周期。

Python 練習:正確更新檔案內容

你將練習「讀取 → 修改 → 寫回」的正確流程,並理解為何不建議直接手動改動文字檔案(容易破壞格式、難以追蹤與重現)。

Check Point 7小測:成績報告流程
(按「下一題」開始)

課題 8 迷你專題:題庫小測(JSON → 出題 → 輸出成績)

重點

教學:在 Python 寫入文字檔案(記錄作答結果)

題庫練習常需要把作答紀錄輸出,便於分析與重溫。最簡單的方法是把每次作答寫成 CSV 的一行並使用 a 模式附加。

from datetime import datetime

qid = "cp8_q01"
choice = "B"
is_correct = True
ts = datetime.now().isoformat(timespec="seconds")

line = f"{ts},{qid},{choice},{int(is_correct)}\n"
with open("attempts.csv", "a", encoding="utf-8") as f:
    f.write(line)
建議同時記錄題目 id、選擇、是否正確與時間,方便日後統計「錯題重練」。

題庫小測專題能把你在本章學到的技能串連起來:你需要設計題庫的 JSON 結構,讀入後抽題,運用循環逐題處理,再把作答結果輸出成檔案。整個過程既是算法訓練,也是資料結構訓練。

如果你希望小測更「可用」,可以加入更多欄位,例如作答時間、題目主題、錯題清單,甚至為每題附上提示。當資料保存得越完整,你就越容易從中看見自己的學習進度。

在最後的練習區,你將看到 20 條「偽代碼 → Python」挑戰題。這些題目聚焦於「把文字資料整理成結構」,讓你用程式把概念真正做出來。

Python 練習:綜合應用

本節把前面技巧整合起來,包括讀取/寫入/更新檔案、以及完成後關閉檔案(close)的重要性。

Check Point 8小測:題庫與輸出
(按「下一題」開始)

Python 額外練習(20 題)

以下 20 題為本章延伸練習,重點集中在文字檔案(.txt)的讀取(read / readline / readlines)以及寫入模式(w / a / x)。每題都設有「文件檢視器」(左右兩欄:原本/目前),方便你觀察程式執行前後檔案內容的變化。

(可選)練習索引:快速跳到指定題目

載入中…