Python文件處理:將文本按詞拆分并逐行寫入新文件

Python文件處理:將文本按詞拆分并逐行寫入新文件

本文詳細介紹了如何使用python編寫一個函數,實現從指定文本文件中讀取內容,將其拆分為獨立的單詞,并將每個單詞作為單獨的一行寫入到另一個新的文件中。教程涵蓋了文件操作、字符串處理及錯誤處理的最佳實踐,旨在提供一個高效、可靠的文本處理方案。

核心功能:單詞提取與寫入

在文本處理任務中,將一段文本拆分為獨立的單詞是常見的操作。本節將介紹如何實現一個python函數 words_from_file(filename1, filename2),該函數接收兩個文件名作為參數:filename1 是輸入文件的路徑,filename2 是輸出文件的路徑。函數的目標是將 filename1 中的所有文本內容按單詞拆分,并將每個單詞單獨寫入 filename2 的一行。

以下是實現此功能的優化代碼:

def words_from_file(filename1, filename2):     """     讀取指定文件中的文本,將其拆分為單詞,并將每個單詞逐行寫入到另一個新文件。      Args:         filename1 (str): 輸入文件的路徑。         filename2 (str): 輸出文件的路徑。     """     try:         # 以只讀模式打開輸入文件         with open(filename1, 'r') as f_input:             # 以寫入模式打開輸出文件。注意:'w' 模式會覆蓋現有文件。             with open(filename2, 'w') as f_output:                 # 逐行讀取輸入文件                 for line in f_input:                     # 使用 split() 方法將當前行拆分為單詞列表                     # 默認情況下,split() 會按任意空白符(空格、制表符、換行符等)分割字符串,                     # 并移除空字符串(例如,多個連續空格只會產生一個分隔符)。                     words = line.split()                     # 遍歷當前行的所有單詞                     for word in words:                         # 將每個單詞寫入輸出文件,并在其后添加一個換行符                         f_output.write(word + 'n')     except FileNotFoundError:         print(f"錯誤:文件 '{filename1}' 未找到。請檢查文件路徑是否正確。")     except Exception as e:         print(f"發生未知錯誤:{e}") 

代碼解析

  1. 函數定義: def words_from_file(filename1, filename2): 定義了一個接受兩個字符串參數(文件路徑)的函數。
  2. 異常處理: try…except FileNotFoundError: 結構用于捕獲文件未找到的常見錯誤,增強了程序的健壯性。同時添加了 except Exception as e 以捕獲其他潛在的運行時錯誤。
  3. 文件打開與關閉:
    • with open(filename1, ‘r’) as f_input: 以只讀模式(’r’)打開輸入文件。
    • with open(filename2, ‘w’) as f_output: 以寫入模式(’w’)打開輸出文件。重要提示: w 模式會清空文件內容,如果文件不存在則創建新文件。如果需要追加內容而不是覆蓋,應使用 ‘a’ 模式。
    • with 語句確保文件在使用完畢后(無論是否發生異常)都會被正確關閉,避免資源泄露。
  4. 逐行讀取: for line in f_input: 循環遍歷輸入文件的每一行。
  5. 單詞拆分: words = line.split() 是關鍵一步。str.split() 方法用于將字符串按指定分隔符(默認為任意空白字符)拆分為一個單詞列表。例如,”Hello worldn”.split() 會得到 [‘Hello’, ‘world’]。
  6. 逐詞寫入: for word in words: 循環遍歷當前行拆分出的每個單詞。
    • f_output.write(word + ‘n’) 將每個單詞寫入輸出文件,并在單詞后添加一個換行符(n),確保每個單詞占據一行。

原代碼分析與改進點

原始代碼中存在幾個關鍵問題,導致其無法正確實現預期功能:

  1. 輸出文件重復打開與覆蓋:

    • 原代碼在處理輸入文件的每一行時,都會重新打開輸出文件 filename2 (with open(filename2, ‘w’) as g:). 由于 ‘w’ 模式會清空文件內容,這意味著每次循環都會清空之前寫入的內容,最終 filename2 只會包含輸入文件最后一行拆分出的單詞。
    • 改進: 優化后的代碼將輸出文件的打開操作 (with open(filename2, ‘w’) as f_output:) 放在了讀取輸入文件循環的外部,確保輸出文件只被打開和清空一次,之后所有單詞都連續寫入。
  2. 誤將行迭代為字符:

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

    • 原代碼中的 for word in lines: 實際上是遍歷字符串 lines 中的每一個字符,而不是單詞。例如,如果 lines 是 “Hello World”, word 會依次是 ‘H’, ‘e’, ‘l’, ‘l’, ‘o’, ‘ ‘, ‘W’, ‘o’, ‘r’, ‘l’, ‘d’。
    • 改進: 優化后的代碼使用 words = line.split() 將一行文本正確地拆分為單詞列表,然后 for word in words: 循環遍歷的是真正的單詞。
  3. 寫入時未添加換行符:

    • 原代碼使用 g.writelines(word)。writelines() 方法通常用于寫入一個字符串列表,每個字符串會直接連接。如果 word 是一個字符(如原代碼中那樣),它會一個接一個地寫入,而不會自動添加換行符。
    • 改進: 優化后的代碼使用 f_output.write(word + ‘n’),顯式地在每個單詞后添加 n,確保每個單詞獨占一行。

使用示例

為了演示 words_from_file 函數的用法,我們創建一個示例輸入文件,并調用該函數。

1. 創建示例輸入文件 (input.txt)

這是一個示例文本文件。 它包含多行內容, 用于測試單詞提取功能。

將上述內容保存為 input.txt。

2. 調用函數

# 假設你的python腳本和 input.txt 在同一個目錄下 input_file = "input.txt" output_file = "output_words.txt"  words_from_file(input_file, output_file) print(f"單詞已成功從 '{input_file}' 提取并寫入到 '{output_file}'。")  # 驗證輸出內容(可選,手動檢查 output_words.txt 文件) # with open(output_file, 'r', encoding='utf-8') as f: #     print("n--- 輸出文件內容 ---") #     print(f.read())

3. 檢查輸出文件 (output_words.txt)

運行上述代碼后,output_words.txt 文件將被創建(或覆蓋),其內容應如下所示:

這是一個 示例文本文件。 它包含 多行內容, 用于測試 單詞提取功能。

注意事項與最佳實踐

  • 文件模式: 確保正確選擇文件打開模式。’r’ (讀取), ‘w’ (寫入,會覆蓋), ‘a’ (追加), ‘b’ (二進制模式) 等。
  • with 語句: 始終使用 with open(…) 語句處理文件,它能確保文件在使用完畢后自動關閉,即使在處理過程中發生錯誤也能正確釋放資源。
  • 編碼: 在處理包含非ASCII字符(如中文)的文本文件時,建議在 open() 函數中明確指定 encoding 參數,例如 encoding=’utf-8’,以避免亂碼問題。
  • split() 的靈活性: str.split() 默認按空白符分割。如果需要按特定字符(如逗號、分號)分割,可以將其作為參數傳遞,例如 line.split(‘,’)。
  • 錯誤處理: 除了 FileNotFoundError,還可以考慮捕獲其他潛在的 IOError 或 PermissionError,以使程序更加健壯。
  • 大文件處理: 對于非常大的文件,逐行讀取(如 for line in f_input:)是內存效率較高的方法,因為它不會一次性將整個文件加載到內存中。

總結

本文詳細闡述了如何通過Python編寫一個高效且健壯的函數,實現從文本文件中提取單詞并將其逐行寫入新文件的功能。通過對原始代碼問題的分析與改進,我們強調了正確的文件操作模式、with 語句的使用、str.split() 方法的正確應用以及必要的錯誤處理機制。掌握這些基本的文件處理技巧,將有助于你在日常的文本數據處理任務中編寫出更加可靠和高效的Python代碼。

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