跳转到主内容
websoft网络软件专家 - 深耕网络技术,打造实用软件!

如何提取文本文件中所有重复出现的单词并写入新文件

本文介绍如何编写 Python 函数,从输入文本文件中识别跨行全局重复的单词(忽略大小写和标点),并将每个重复词仅保存一次到输出文件中,解决原代码仅保留最后一行重复词的逻辑缺陷。 本文介绍如何编写 python 函数,从输入文本文件中识别**跨行全局重复**的单词(忽略大小写和标点),并将每个重复词仅保存一次到输出文件中,解决原代码仅保留最后一行重复词的逻辑缺陷。 原始代码存在两个关键问题:一是 seen_words 和 repeat_words 被错误地定义在循环内部(每行重置),导致无法跨行累计词频;二是未使用上下文管理器,存在资源泄漏风险。正确做法是将状态变量提升至函数作用域顶层,并利用 set 高效追踪已见词汇。 以下是修复后的完整实现:
import string def repeat_words(in_file, out_file): seen_words = set() # 全局记录所有已出现过的单词(去重、高效查找) repeated_words = [] # 按首次发现重复的顺序记录重复词(保持唯一性) with open(in_file, "r", encoding="utf-8") as file_in, \ open(out_file, "w", encoding="utf-8") as file_out: for line in file_in: # 逐行读取,避免 readlines() 一次性加载大文件 words = line.split() for word in words: # 统一转小写 + 剥离首尾标点(如 'Hello!' → 'hello') clean_word = word.lower().strip(string.punctuation) # 空字符串(如纯标点行)或仅含空白符的词应跳过 if not clean_word: continue if clean_word in seen_words and clean_word not in repeated_words: repeated_words.append(clean_word) seen_words.add(clean_word) # 写入结果:空格分隔,无换行尾缀(可根据需求调整) file_out.write(' '.join(repeated_words))
使用示例: 假设 nnn.txt 内容为:
Hello world! This is a test. Hello again, world.
运行 repeat_words("nnn.txt", "Untitled-1.txt") 后,输出文件将写入: hello world 注意事项: ✅ 使用 with 语句确保文件自动关闭,安全可靠; ✅ seen_words 定义在循环外,实现 全文档级 重复检测; ✅ string.punctuation 覆盖常见英文标点(,.!?;"'() 等),但不处理内嵌标点(如 don't → 't);如需更健壮分词,建议使用 re.split(r'\W+', line) 或 nltk; ⚠️ 当前逻辑仅识别「出现 ≥2 次」的词,且每个重复词在输出中仅出现一次; ? 若需统计重复次数或按频次排序,可改用 collections.Counter 替代 list + set 组合。 该方案简洁、高效、符合 Python 最佳实践,适用于中等规模文本的重复词提取任务。

相关文章