File system hierarchy diagram showing different file types organized in folders

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

結語

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

發佈留言

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

High Quality

Lorem ipsum dolor sit amet, consectetur adipiscing elitsed do eiusmod tempor.

Fast Delivery

Lorem ipsum dolor sit amet, consectetur adipiscing elitsed do eiusmod tempor.

Best Warranty

Lorem ipsum dolor sit amet, consectetur adipiscing elitsed do eiusmod tempor.