Python中可靠地處理檔案

banq發表於2024-06-04

處理檔案是許多 Python 程式的基本組成部分。無論是儲存資料、讀取配置還是編寫報告,瞭解如何有效地與檔案互動都至關重要。但是,意外錯誤有時會破壞程式的流程。這時異常就派上用場了——異常是一種強大的工具,可幫助您妥善處理這些錯誤並防止程式崩潰。

在本文中,我們將深入探討 Python 中的檔案和異常。我們將學習如何:

  • 有效地開啟、讀取、寫入和關閉檔案。
  • 瀏覽不同的檔案格式,如文字和 CSV。
  • 瞭解常見的檔案相關錯誤。
  • 實現異常處理技術,使您的程式碼更加健壯和使用者友好。

在這次旅程結束時,您將能夠熟練掌握檔案操作,並讓您的 Python 程式順利執行,即使事情沒有完全按計劃進行!

1. 檔案 I/O 基礎知識
想象一下,你的 Python 程式是一個間諜,執行從秘密檔案(或者只是購物清單)中收集情報的任務。成為一名優秀的間諜需要具備基本技能,在 Python 中,這意味著掌握檔案處理:

  1. 開啟檔案:這就像進入密室。你使用該open()函式,給它一個檔名,就像一個秘密程式碼。例如,open("shopping_list.txt")。
  2. 閱讀檔案:進入後,您需要閱讀資訊。您可以根據需要使用不同的方法:
    • 一次讀取整個檔案:想象一下找到一張寫滿所有內容的便條。您可以使用read()它將所有內容作為一個大字串獲取。
    • 逐行讀取:想象一下購物清單,每項物品佔一行。您可以使用迴圈逐行readline()讀取每一行。
  3. 寫入檔案:您可能需要在密室中留下新訊息。您可以使用write()它向檔案新增新資訊。
  4. 關閉檔案:對於偵探來說,空手而歸可不是個好主意!close()正確關閉檔案並避免任何問題非常重要。 <ul>
  5. 檔案模式:選擇您的訪問許可權
    將檔案模式想象成一把鑰匙,它能讓你在房間裡做不同的事情:

    • “r”(閱讀模式):您只能檢視資訊,而不能更改任何內容。
    • “w”(寫入模式):小心!此模式會在寫入新內容之前擦除檔案中的所有內容。
    • “a”(追加模式):這就像在現有列表末尾新增註釋。新增新資訊而不會刪除任何內容。

    檔案路徑:找到自己的路徑
    有兩種方法可以告訴您的程式在哪裡找到該檔案:

    • 絕對路徑:這是完整地址,就像完整的地圖參考。例如,“C:/Users/John/Documents/shopping_list.txt”。
    • 相對路徑:這就像從您當前的位置給出方向。例如,“shopping_list.txt”假定該檔案與您的程式位於同一資料夾中。

    2. 檔案處理技術
    想象一下你是一位作家,正在創作一個引人入勝的故事。在 Python 中,你可以逐行處理文字檔案,就像這些場景一樣!
    逐行閱讀:

    • 想想懺悔信:你使用迴圈來readline()讀取每一行,就像一次讀一行信一樣。以下是一個例子:

    with open(<font>"confession.txt", "r") as file:
      for line in file:
        print(line, end=
    "")  # Print each line without a newline at the end

    • 思考寫一個故事:您可以使用迴圈將write()行新增到檔案中,就像逐句構建您的故事一樣。

    真實示例:想象一下逐行讀取儲存在文字檔案中的網站訪問者資料。您可以使用此程式碼來計算訪問者數量:
    visitor_count = 0
    with open(<font>"visitors.txt", "r") as file:
      for line in file:
        visitor_count += 1  # Increment the counter for each line (visitor)
    print(
    "Total Visitors:", visitor_count)

    二進位制檔案:超越文字(影像、音訊)
    文字檔案將資訊儲存為可讀字元。二進位制檔案(如影像 (JPEG、PNG) 或音訊 (MP3))包含計算機可直接理解的資料。雖然 Python 無法讀取內容本身,但它可以:

    • 複製和移動二進位制檔案:假設偵探需要複製一個秘密影片檔案。Python 可以複製或移動整個檔案,而無需瞭解其內容。
    • 讀取/寫入二進位制資料塊:對於特定任務,您可以以較小的塊讀取或寫入資料。

    現實世界的示例:可以透過從 Web 伺服器讀取資料塊並將其寫入計算機上的新檔案來從網際網路下載大影像。

    CSV 檔案:逗號分隔值冠軍
    逗號分隔值 (CSV) 檔案就像可以在許多程式中開啟的電子表格。每行代表一行,逗號分隔值(列)。Python 可以處理 CSV 檔案進行資料分析:

    • 讀取 CSV 資料:想象一下,一名偵探正在分析包含犯罪現場詳細資訊的 CSV 檔案。諸如此類的庫csv允許您逐行讀取資料並按列號訪問特定值。
    • 寫入 CSV 資料:偵探也許想根據他們的發現建立新報告。您可以使用csv它將資料寫入新的 CSV 檔案。

    真實示例:許多網站允許下載 CSV 格式的資料。您可以使用 Python 讀取這些資料並進行分析以瞭解趨勢或見解。

    3.異常處理機制
    以下是一些常見的與檔案相關的異常:

    • FileNotFoundError:這就像偵探在檔案應該所在的位置找到了一個空房間。這意味著程式無法找到指定的檔案。
    • PermissionError:假設偵探缺少開啟檔案的金鑰(許可權)。當您的程式嘗試訪問檔案但沒有必要的許可權(讀取、寫入等)時,會發生此異常。

    Block try...except:你的錯誤處理鎧甲
    可以將街區想象try...except成偵探用來處理意外情況的工具包。

    • 塊try:這是放置可能導致錯誤的程式碼的地方,例如開啟檔案。
    • 塊except:如果塊內發生錯誤try,except塊會捕獲該錯誤併為您提供適當處理該錯誤的機會。

    try:
      with open(<font>"secret_message.txt", "r") as file:
        message = file.read()  # This line might cause an error
        print(message)
    except FileNotFoundError:
      print(
    "Error: File not found!")

    此示例中,如果檔案“secret_message.txt”不存在,則塊FileNotFoundError將捕獲異常except,並顯示使用者友好的訊息,而不是程式崩潰。

    街區finally:總是關著門(檔案)
    請記住,即使出現問題,偵探也需要關閉門(檔案)。finally即使出現異常,塊也能確保檔案始終正確關閉。

    try:
      with open(<font>"secret_message.txt", "r") as file:
        message = file.read()
        print(message)
    except FileNotFoundError:
      print(
    "Error: File not found!")
    finally:
      # This block will always run, even if there's no error
      if file:  # Check if the file object exists
        file.close()  # Close the file to avoid issues

    透過使用try...except和finally塊,您可以編寫強大且使用者友好的 Python 程式碼,這些程式碼可以預測並妥善處理與檔案相關的錯誤。這可以讓您的程式順利執行並防止意外崩潰,就像一個準備充分的偵探一樣!

    綜合
    現在您已經掌握了基本知識,讓我們探索如何結合檔案 I/O 和異常處理來構建健壯且使用者友好的 Python 程式!

    示例 1:保護檔案操作的使用者輸入
    假設有一個程式允許使用者輸入檔名來讀取其內容。以下是處理潛在錯誤的方法:

    def read_file(filename):
      <font>"""Reads the contents of a file and handles potential errors.
     
      Args:
          filename: The name of the file to read.
     
      Returns:
          The contents of the file as a string, or None if an error occurs.
     
    """
      try:
        with open(filename,
    "r") as file:
          return file.read()
      except FileNotFoundError:
        print(f
    "Error: File '{filename}' not found.")
      except PermissionError:
        print(f
    "Error: You don't have permission to access '{filename}'.")
      return None  # Indicate error by returning None
     
    # Get user input and handle potential errors
    user_input = input(
    "Enter the file name: ")
    file_contents = read_file(user_input)
     
    if file_contents:
      print(
    "File contents:", file_contents)
    else:
      print(
    "An error occurred while reading the file.")

    此程式碼定義了一個read_file嘗試開啟使用者提供的檔名的函式。它使用一個try...except塊來捕獲潛在的FileNotFoundError異常PermissionError。如果發生錯誤,則會顯示一條使用者友好的訊息,並且該函式返回None以指示失敗。

    示例 2:使用錯誤恢復將使用者資料寫入檔案
    現在,讓我們建立一個程式,讓使用者輸入姓名和電子郵件並將其儲存到檔案中。以下是如何寫入資料和預測錯誤:

    def save_user_data(name, email):
      <font>"""Saves user data (name and email) to a file, handling potential errors.
     
      Args:
          name: The user's name.
          email: The user's email address.
     
    """
      try:
        with open(
    "user_data.txt", "a") as file:
          file.write(f
    "Name: {name}\nEmail: {email}\n\n")
      except PermissionError:
        print(
    "Error: You don't have permission to write to the file.")
     
    # Get user input
    name = input(
    "Enter your name: ")
    email = input(
    "Enter your email: ")
     
    save_user_data(name, email)
    print(
    "User data saved successfully!")

    此程式碼定義了一個save_user_data函式。它使用一個try...except塊來捕獲PermissionError程式缺少寫入許可權時可能出現的問題。如果成功,則將使用者資料寫入檔案,然後顯示成功訊息。

    關鍵要點:

    • 預測錯誤:考慮潛在問題,例如檔案丟失或許可權問題,並使用try...except塊優雅地處理它們。
    • 資訊性錯誤訊息:出現錯誤時向使用者提供清晰且資訊豐富的訊息,解釋出了什麼問題。
    • 穩健性:透過結合錯誤處理,您的程式碼變得更加穩健,防止意外崩潰並確保更流暢的使用者體驗。

     

    相關文章