
本文介绍如何编写 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 最佳实践,适用于中等规模文本的重复词提取任务。










