iT邦幫忙

2024 iThome 鐵人賽

DAY 16
0

第十四天:Python 文件處理——讀取與寫入文件

內容概述:

今天我們將學習 Python 中的文件處理,這是日常開發中非常常見的需求之一。無論是讀取文件內容或是將數據寫入文件,掌握文件操作將使你能夠處理更多的資料來源。


一、為什麼需要文件處理?

  • 文件處理在程式開發中扮演著重要角色,尤其在需要持久化數據(保存數據)時,例如保存用戶設定、日誌紀錄、報告生成等。
  • 文件的操作通常包括 讀取(read)寫入(write)追加(append)

二、基本的文件操作

1. 打開文件 open()
  • 在 Python 中,可以使用 open() 函數來打開文件。基本語法:
    file = open('filename', 'mode')
    
  • 其中,mode 定義了你打開文件的方式:
    • 'r': 讀取模式(read)
    • 'w': 寫入模式(write),如果文件不存在會創建文件,存在則覆蓋。
    • 'a': 追加模式(append),在文件末尾添加內容。
    • 'b': 二進制模式(binary),用於處理非文字文件(如圖片)。
2. 讀取文件 read()
  • 讀取文件是將文件內容讀入記憶體中,供程式處理。可以使用 read()readline()readlines()
  • read() 會讀取整個文件:
    file = open('example.txt', 'r')
    content = file.read()
    print(content)
    file.close()
    
  • 記得讀取文件後需要使用 close() 關閉文件,釋放資源。
3. 寫入文件 write()
  • 如果需要將數據寫入文件,可以使用 write()
    file = open('output.txt', 'w')
    file.write("Hello, Python!")
    file.close()
    
4. 追加文件 append()
  • 使用 'a' 模式可以在不覆蓋文件內容的前提下,將新數據追加到文件末尾:
    file = open('output.txt', 'a')
    file.write("\nAppending new content.")
    file.close()
    

三、使用 with 語法進行文件操作

  • Python 提供了一個更簡潔且安全的方式來進行文件操作,使用 with 語句可以自動關閉文件,即使發生錯誤也不會影響資源釋放。
    with open('example.txt', 'r') as file:
        content = file.read()
        print(content)
    # 文件會自動關閉
    

四、讀取大文件的方式

  • 當文件非常大時,直接使用 read() 可能會耗盡記憶體。這時可以使用 readline() 一次讀取一行,或是使用迴圈逐行讀取:
    with open('large_file.txt', 'r') as file:
        for line in file:
            print(line.strip())  # .strip() 可以去除換行符
    

五、文件的讀寫模式

  1. 讀取模式 ('r')

    • 用於讀取文件。當文件不存在時,會引發 FileNotFoundError
  2. 寫入模式 ('w')

    • 用於寫入文件,文件不存在時會創建,存在時會覆蓋內容。
  3. 追加模式 ('a')

    • 用於向文件末尾追加內容,文件不存在時會創建文件。
  4. 二進制模式 ('b')

    • 適用於非文字文件,如圖片、音樂等。
    • 結合讀取或寫入模式,如 'rb''wb'

六、實作範例

範例 1:從文件讀取內容

假設有一個名為 students.txt 的文件,裡面記錄了學生名單,我們可以讀取並輸出它的內容:

with open('students.txt', 'r') as file:
    content = file.read()
    print("學生名單:")
    print(content)
範例 2:將輸出結果寫入文件

我們可以將一個程式的運行結果保存到文件中,方便後續查看:

result = "計算結果: 50"

with open('result.txt', 'w') as file:
    file.write(result)

print("結果已保存到 result.txt 文件中。")
範例 3:讀取 CSV 文件

CSV(逗號分隔值)是一種常見的資料儲存格式,我們可以使用 Python 內建的 csv 模組來讀取這類文件:

import csv

with open('data.csv', 'r') as file:
    reader = csv.reader(file)
    for row in reader:
        print(row)

七、處理文件錯誤

  1. FileNotFoundError

    • 當嘗試打開一個不存在的文件時,會引發這個錯誤。我們可以使用 try-except 來處理:
      try:
          with open('non_existent_file.txt', 'r') as file:
              content = file.read()
      except FileNotFoundError:
          print("文件不存在。")
      
  2. 權限錯誤

    • 當沒有讀取或寫入文件的權限時,會引發 PermissionError,這通常發生在嘗試訪問系統或受保護的文件時。

八、練習與實作

練習 1:文件讀取與錯誤處理
  • 寫一個程式,要求用戶輸入一個文件名,然後讀取並顯示文件內容。如果文件不存在,顯示錯誤訊息。
練習 2:文件寫入與追加
  • 建立一個簡單的日誌系統,每次程式運行時,將時間戳記和執行結果追加到一個日誌文件中。

練習 1:文件讀取與錯誤處理

這個練習要求編寫一個程式來讀取使用者輸入的檔案名,並顯示其內容。若檔案不存在,則顯示錯誤訊息。

def read_file():
    filename = input("請輸入檔案名稱: ")
    try:
        with open(filename, 'r', encoding='utf-8') as file:
            content = file.read()
            print("檔案內容如下:")
            print(content)
    except FileNotFoundError:
        print(f"錯誤:檔案 {filename} 不存在。")
    except Exception as e:
        print(f"發生錯誤:{e}")

# 測試程式
read_file()

解釋:

  • open():嘗試以讀取模式開啟指定檔案。
  • FileNotFoundError:捕捉當檔案不存在時引發的錯誤,顯示提示訊息。
  • Exception:捕捉其他潛在錯誤,提供通用的錯誤處理。

練習 2:文件寫入與追加

建立一個簡單的日誌系統,每次程式運行時,將當前的時間戳記和執行結果追加到一個日誌檔案中。

import datetime

def log_result(result):
    timestamp = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    log_entry = f"{timestamp} - 執行結果: {result}\n"
    
    with open("log.txt", "a", encoding='utf-8') as log_file:
        log_file.write(log_entry)

    print("日誌已更新。")

# 測試程式
result = "程式運行成功"
log_result(result)

解釋:

  • datetime.datetime.now():獲取當前的日期和時間,並格式化為字串。
  • "a" 模式:使用追加模式 (a) 打開檔案,這樣每次運行時會將新內容追加到檔案末尾,而不覆蓋現有內容。
  • log_result 函數:將執行結果和時間戳寫入日誌檔案。

這些範例展示了如何進行文件的讀取與寫入,以及如何有效地處理錯誤並在每次程式運行時更新日誌檔案。


九、學習總結

今天我們學習了如何進行基本的文件操作,包括讀取、寫入和追加文件,並且了解到如何使用 with 語句更安全地管理文件資源。掌握這些技巧,將使你能夠處理真實世界中的數據文件,更加靈活地完成各種應用場景。


下一堂課預告

第十五天:Python 進階:物件導向程式設計 (OOP) 的基礎


上一篇
從 0 開始學!跟著 ChatGPT 學會 Python 錯誤處理
下一篇
跟著 ChatGPT成為程式大佬!Python 物件導向程式設計 (OOP)
系列文
如果讓chatgpt參加iThome鐵人賽,他竟然寫出...!?31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言