本教程详解如何编写 Python 函数,遍历输入文本文件的所有行与单词,准确识别在整个文档中至少出现两次的单词(忽略大小写和标点),去重后以空格分隔写入输出文件。
本教程详解如何编写 python 函数,遍历输入文本文件的所有行与单词,准确识别**在整个文档中至少出现两次**的单词(忽略大小写和标点),去重后以空格分隔写入输出文件。
原始代码存在两个关键缺陷:一是 seen_words 和 repeat_words 被错误地定义在循环内部,导致每行独立维护状态,仅能捕获单行内重复词;二是未对单词统一转小写+去标点后再判断,影响匹配准确性;三是未使用上下文管理器,存在资源泄漏风险。
正确做法是将状态变量(seen_words 和 repeated_words)提升至函数作用域顶层,确保跨行累计统计;同时借助 set 高效记录已见词汇,并用 list 有序保存首次确认重复的单词(保持发现顺序)。
以下是优化后的完整实现:
import string
def repeat_words(in_file, out_file):
with open(in_file, "r", encoding="utf-8") as file_in, \
open(out_file, "w", encoding="utf-8") as file_out:
seen_words = set() # 记录所有已出现过的单词(标准化后)
repeated_words = [] # 记录首次被确认为重复的单词(去重、保序)
for line in file_in: # 直接迭代文件对象,更内存友好
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)
# 写入结果:单词间空格分隔,末尾不加换行(如需可加 '\n')
file_out.write(' '.join(repeated_words))
✅ 关键改进说明:
- 使用 with 语句自动安全关闭文件,避免 close() 遗漏;
- encoding="utf-8" 显式指定编码,兼容中文、特殊符号等;
- strip(string.punctuation) 仅移除单词首尾标点(如 "word," → "word"),保留内部标点(如 "can't" 中的撇号);
- repeated_words 用 list 而非 set,确保输出顺序与单词首次重复出现的顺序一致;
- 空字符串校验防止 '' 被误判为重复词。
? 使用示例:
假设 nnn.txt 内容为:
The cat sat on the mat. A cat is cute, and the cat sleeps!
运行 repeat_words("nnn.txt", "result.txt") 后,result.txt 将写入:
the cat
(因 the 出现3次、cat 出现3次,均满足“全文重复”条件;a、is 等仅出现1次,被忽略)
⚠️ 注意事项:
- 该逻辑识别的是全文范围内的重复词(≥2次),而非单行重复;
- 单词边界以空白符(空格、制表符、换行)分割,不支持连字符或缩写智能切分(如 "state-of-the-art" 需按需预处理);
- 如需区分大小写或保留标点,请调整 clean_word 构造逻辑。
此方案简洁健壮,适用于日志分析、文本去重、关键词提取等典型场景。










