Python 檔案處理(11):讓你的程式能讀能寫,真正動起來!

在學習 Python 的過程中,我們一開始寫的程式,大多數都只是在記憶體裡運算,輸出結果停留在螢幕上。雖然可以完成一些小任務,但這樣的程式仍然是「短暫」的 —— 一旦結束,所有結果就消失不見了。

那麼,如何讓程式記住我們的成果?答案就是 檔案輸入輸出(File I/O)。透過讀取檔案,你的程式可以存取外部的資料與設定;透過寫入檔案,你的程式可以留下結果,與其他系統交換訊息。從數據分析、日誌記錄,到應用程式設定檔,檔案處理幾乎無所不在。

什麼是檔案?為什麼需要檔案 I/O?

檔案是電腦儲存和組織數據的方式。它們是資料的容器,可以是任何內容:

  • 文字文件(如 .txt, .py, .html)
  • 圖像檔案(如 .jpg, .png)
  • 音頻檔案(如 .mp3, .wav)
  • 結構化數據(如 .csv, .json)

檔案 I/O(輸入/輸出)是程式與外部檔案交互的過程。當你保存文檔、下載歌曲、發送電子郵件時,你都在創建檔案。

學習檔案 I/O 使你能夠:存儲程式數據、讀取配置信息、處理大型數據集、與其他程式共享信息。

使用 Python 讀取檔案

with open('real_cool_document.txt') as cool_doc:
    cool_contents = cool_doc.read()
    print(cool_contents)
  

open() 函數創建一個指向檔案的檔案對象。第一個參數是檔案名稱。預設情況下,檔案以讀取模式(’r’)打開。

with 關鍵字創建一個上下文管理器,它會自動處理檔案的打開和關閉,確保程式執行完畢後資源被正確釋放。

read() 方法讀取整個檔案的內容並將其作為字符串返回。

逐行讀取檔案

使用 readlines()

讀取所有行到一個列表中

with open('keats_sonnet.txt') as file:
    lines = file.readlines()
    for line in lines:
        print(line)
      

直接迭代檔案對象

更高效的方法

with open('keats_sonnet.txt') as file:
    for line in file:
        print(line)
      

使用 readline()

一次讀取一行

with open('file.txt') as file:
    first_line = file.readline()
    second_line = file.readline()
      

當處理大型檔案時,逐行讀取比一次讀取整個檔案更有效率,因為它使用更少的記憶體。每次調用 readline() 都會讀取下一行,如果已到檔案末尾則返回空字串。

寫入檔案

寫入模式 (‘w’)

with open('generated_file.txt', 'w') as gen_file:
    gen_file.write("What an incredible file!")
      

注意:使用 ‘w’ 模式會創建新檔案或完全覆蓋現有檔案!

附加模式 (‘a’)

with open('generated_file.txt', 'a') as gen_file:
    gen_file.write("\n... and it still is")
      

使用 ‘a’ 模式會將內容添加到檔案末尾,而不會刪除現有內容。

選擇正確的模式非常重要:’w’ 用於創建新檔案或覆蓋現有檔案,’a’ 用於保留現有內容並添加新內容。

Notebook with pen writing on paper, showing file being created or appended

什麼是 CSV 檔案?

CSV file structure showing rows and columns with comma separators, spreadsheet data visualization

CSV(Comma-Separated Values,逗號分隔值)是一種用於存儲表格數據的簡單文件格式。它通常用於在不同應用程式之間交換數據,特別是從電子表格軟體(如 Microsoft Excel 或 Google Sheets)匯出數據。

CSV 檔案的特點:

  • 每行對應表格中的一行
  • 字段之間用分隔符(通常是逗號)分隔
  • 第一行通常包含欄位名稱(標題行)
  • 是純文本檔案,可以用任何文本編輯器打開

讀取 CSV 檔案

CSV 檔案內容示例

Name,Username,Email
Roger Smith,rsmith,wigginsryan@yahoo.com
Michelle Beck,mlbeck,hcosta@hotmail.com
Ashley Barker,a_bark_x,a_bark_x@turner.com
Lynn Gonzales,goodmanjames,lynniegonz@hotmail.com
      

使用 csv.DictReader

import csv

email_list = []
with open('users.csv', newline='') as users_csv:
    user_reader = csv.DictReader(users_csv)
    for row in user_reader:
        email_list.append(row['Email'])

print(email_list)
      

csv.DictReader 將 CSV 檔案的每一行轉換為 Python 字典,其中字典的鍵是 CSV 檔案的標題行中的欄位名稱。這使得通過名稱而不是索引訪問數據變得更加容易。

參數 newline='' 防止因數據中的換行符而錯誤地解析行。

寫入 CSV 檔案

import csv

data = [
    {'name': '張三', 'userid': 6712359021, 'is_admin': False},
    {'name': '李四', 'userid': 2525942, 'is_admin': False},
    {'name': '王五', 'userid': 15890235, 'is_admin': False},
    {'name': '趙六', 'userid': 572189563, 'is_admin': True}
]

with open('output.csv', 'w', newline='') as output_csv:
    fields = ['name', 'userid', 'is_admin']
    output_writer = csv.DictWriter(output_csv, fieldnames=fields)
    
    output_writer.writeheader()  # 寫入標題行
    for item in data:
        output_writer.writerow(item)  # 寫入數據行
      

生成的 CSV 檔案內容

name,userid,is_admin
張三,6712359021,False
李四,2525942,False
王五,15890235,False
趙六,572189563,True
      

什麼是 JSON 檔案?

JSON(JavaScript Object Notation)

  • 輕量級的數據交換格式
  • 基於 JavaScript 的語法,但獨立於編程語言
  • 人類可讀性強,機器也容易解析
  • 支持複雜的嵌套數據結構
  • 廣泛用於 Web API 和配置檔案

JSON 格式與 Python 字典非常相似,這使得它在 Python 中特別易於使用。

讀取 JSON 檔案

JSON 檔案內容

{
  "user": "ellen_greg",
  "action": "purchase",
  "item_id": "14781239",
  "price": 19.99
}
      

Python 代碼

import json

with open('purchase_14781239.json') as purchase_json:
    purchase_data = json.load(purchase_json)

print(purchase_data['user'])  # 輸出: ellen_greg
print(purchase_data['price'])  # 輸出: 19.99
      

json.load() 方法將 JSON 檔案解析為 Python 對象。JSON 對象會被轉換為 Python 字典,JSON 數組會被轉換為 Python 列表。

這種轉換使得在 Python 中處理 JSON 數據變得非常直觀。你可以像操作普通 Python 對象一樣操作從 JSON 中載入的數據。

寫入 JSON 檔案

Python 代碼

import json

data = {
  "eventId": 674189,
  "dateTime": "2015-02-12T09:23:17.511Z",
  "chocolate": "Semi-sweet Dark",
  "isTomatoAFruit": True
}

with open('output.json', 'w') as json_file:
    json.dump(data, json_file, indent=2)
      

生成的 JSON 檔案內容

{
  "eventId": 674189,
  "dateTime": "2015-02-12T09:23:17.511Z",
  "chocolate": "Semi-sweet Dark",
  "isTomatoAFruit": true
}
      

indent=2 參數使輸出的 JSON 更易讀,每個嵌套層次縮進 2 個空格。

Python 的 True 值在 JSON 中會變成小寫的 true

結語

無論是處理文字、管理設定,還是分析結構化數據,這些技能都能幫助你將程式碼從「單純執行」提升到「解決實際問題」。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

返回頂端