Python實現文本文件單詞逐行寫入的函數指南

Python實現文本文件單詞逐行寫入的函數指南

本教程詳細介紹了如何使用python編寫一個名為words_from_file的函數,該函數能高效地讀取指定文本文件,將文件內容按單詞進行拆分,并將每個單詞獨立地寫入到另一個新文件中,確保每個單詞占據一行。文章涵蓋了文件操作、字符串處理以及健壯的錯誤處理機制。

1. 功能概述與函數定義

在文本處理任務中,我們經常需要將文件內容分解為更小的單元,例如單詞。本指南將展示如何創建一個Python函數words_from_file(filename1, filename2),其核心功能是從filename1指定的輸入文件中讀取文本,將其中的每個單詞提取出來,然后將這些單詞逐行寫入到filename2指定的新文件中。

2. 核心實現與代碼解析

實現此功能的關鍵在于正確地處理文件讀寫操作以及字符串的分割。以下是推薦的函數實現:

def words_from_file(filename1, filename2):     """     讀取指定文本文件,將其內容按單詞拆分,并將每個單詞逐行寫入到另一個新文件。      參數:     filename1 (str): 輸入文件的路徑。     filename2 (str): 輸出文件的路徑。     """     try:         # 以只讀模式打開輸入文件         with open(filename1, 'r', encoding='utf-8') as f_in:             # 以寫入模式打開輸出文件。注意:'w'模式會清空文件內容,             # 如果文件不存在則創建新文件。             with open(filename2, 'w', encoding='utf-8') as f_out:                 # 逐行讀取輸入文件                 for line in f_in:                     # 使用split()方法將每行文本分割成單詞。                     # 默認情況下,split()會根據所有空白字符(空格、制表符、換行符等)進行分割,                     # 并移除空字符串。                     words = line.split()                     # 遍歷當前行的所有單詞,并逐一寫入輸出文件                     for word in words:                         # 將每個單詞寫入文件,并在其后添加換行符,確保每個單詞占據一行                         f_out.write(word + 'n')     except FileNotFoundError:         # 捕獲文件未找到的異常,并打印友好的錯誤信息         print(f"錯誤:文件 '{filename1}' 或 '{filename2}' 未找到。請檢查文件路徑。")     except Exception as e:         # 捕獲其他可能的I/O或運行時錯誤         print(f"發生未知錯誤:{e}") 

代碼解析:

  1. 文件打開模式與上下文管理器 (with open(…)):

    • with open(filename1, ‘r’, encoding=’utf-8′) as f_in:: 使用’r’模式以只讀方式打開輸入文件。推薦指定encoding=’utf-8’以處理各種字符編碼,避免亂碼。with語句確保文件在操作完成后自動關閉,即使發生錯誤。
    • with open(filename2, ‘w’, encoding=’utf-8′) as f_out:: 使用’w’模式以寫入方式打開輸出文件。重要提示: ‘w’模式會在打開時清空文件內容。如果此文件不存在,它會被創建。此行代碼被放置在外部循環之外,確保輸出文件只被打開和清空一次,從而所有單詞都能被寫入,而不是每次處理一行時都被覆蓋。
  2. 逐行讀取 (for line in f_in):

    立即學習Python免費學習筆記(深入)”;

    • 此循環高效地從輸入文件中逐行讀取內容。
  3. 單詞分割 (line.split()):

    • words = line.split(): 這是將一行文本拆分為單詞的關鍵步驟。str.split()方法在不帶參數時,會根據任意空白字符(空格、制表符、換行符等)進行分割,并自動處理多個連續空白字符的情況,返回一個包含所有單詞的列表。
  4. 逐詞寫入 (f_out.write(word + ‘n’)):

    • for word in words:: 遍歷從當前行中提取出的所有單詞。
    • f_out.write(word + ‘n’): 將每個單詞寫入輸出文件。關鍵在于在單詞后添加’n’(換行符),確保每個單詞都獨占一行。
  5. 錯誤處理 (try-except):

    • try…except FileNotFoundError: 這是一個最佳實踐,用于捕獲最常見的錯誤——文件不存在。當open()函數無法找到指定文件時,會拋出FileNotFoundError。
    • except Exception as e: 捕獲其他所有可能發生的異常,提供更健壯的錯誤處理。

3. 使用示例

假設我們有一個名為 input.txt 的文件,內容如下:

It is a sample file. This is another line.

我們可以這樣調用函數:

# 創建一個示例輸入文件 with open("input.txt", "w", encoding='utf-8') as f:     f.write("It is an")     f.write("sample file.n")     f.write("This is another line.n")  # 調用函數處理文件 words_from_file("input.txt", "output.txt")  # 驗證輸出文件內容 print("n--- output.txt 的內容 ---") try:     with open("output.txt", "r", encoding='utf-8') as f_out:         print(f_out.read()) except FileNotFoundError:     print("輸出文件未生成。")

執行上述代碼后,output.txt 文件內容將是:

It is a sample file. This is another line.

4. 注意事項與優化

  • 原始代碼的常見錯誤: 在原始的問題代碼中,with open(filename2, ‘w’) as g: 語句被錯誤地放置在了讀取輸入文件行的循環內部。這意味著對于輸入文件中的每一行,輸出文件filename2都會被重新打開(并被清空),導致最終filename2中只包含輸入文件中最后一行的單詞。正確的做法是,輸出文件應該在所有行處理之前只打開一次,如本教程的示例所示。
  • 編碼: 始終建議在open()函數中明確指定encoding=’utf-8’,以確保能夠正確處理各種語言的字符,避免編碼錯誤。
  • 標點符號處理: line.split()默認只根據空白字符分割。如果需要更復雜的單詞提取(例如,將”file.”視為”file”),則需要在split()之前或之后進行額外的字符串處理,例如使用str.strip()去除標點符號,或使用正則表達式進行更精細的匹配。
  • 大小寫統一: 如果需要進行不區分大小寫的單詞處理,可以在寫入前使用word.lower()或word.upper()將單詞轉換為統一大小寫。
  • 內存效率: 對于非常大的文件,逐行讀取是內存效率較高的方法。如果文件特別巨大,甚至無法一次性讀入一行,可以考慮更高級的流式處理或分塊讀取。
  • 輸出模式: 如果你希望將單詞追加到現有文件而不是覆蓋,可以將輸出文件的打開模式從’w’改為’a’(append,追加模式)。

5. 總結

words_from_file函數提供了一個簡潔而高效的方法來處理文本文件,實現單詞的提取和逐行寫入。通過理解文件操作的正確模式、字符串分割的機制以及適當的錯誤處理,我們可以構建出健壯且實用的文本處理工具。在實際應用中,可以根據具體需求進一步擴展此函數,例如添加標點符號過濾、大小寫轉換等功能。

? 版權聲明
THE END
喜歡就支持一下吧
點贊7 分享