
本文介绍如何使用 Python 读取文本文件并精准提取所有包含目标关键词(如 "holiday")的完整行,避免常见误区(如误用 read() 和 find()),推荐使用 readlines() 与 with 语句确保安全、高效、可读性强的行级匹配。
本文介绍如何使用 python 读取文本文件并精准提取所有包含目标关键词(如 "holiday")的完整行,避免常见误区(如误用 `read()` 和 `find()`),推荐使用 `readlines()` 与 `with` 语句确保安全、高效、可读性强的行级匹配。
在处理日志、配置或结构化程度不高的文本文件时,常需根据关键词定位并提取其所在整行内容——而非仅匹配关键词本身。初学者易犯两个典型错误:一是调用 read() 将整个文件读为单个长字符串,导致无法按“行”逻辑处理;二是误用 str.find() 判断条件(find() 返回 -1 表示未找到,但 -1 在 if 中仍为真值,造成逻辑错误)。
正确做法是逐行读取并判断。推荐使用 with open(...) 上下文管理器,它能自动关闭文件、防止资源泄漏,即使发生异常也安全可靠:
count = 0
matches = []
with open("test.txt", "r", encoding="utf-8") as f:
for line in f: # 直接迭代文件对象,内存友好,无需 readlines()
if "holiday" in line.lower(): # .lower() 实现大小写不敏感匹配
count += 1
matches.append(line.rstrip('\n')) # 去除换行符,便于后续处理或打印
print(line, end='') # end='' 避免重复换行上述代码中,for line in f 比 f.readlines() 更节省内存(尤其对大文件),且每轮 line 即为原始的一行字符串(含末尾 \n)。我们使用 in 运算符替代 find(),语义清晰、返回布尔值,杜绝逻辑陷阱;添加 .lower() 可兼顾 "Holiday"、"HOLIDAY" 等变体;rstrip('\n') 用于规范化存储,而 print(line, end='') 则保留原始格式输出。
运行后,对于示例文件:
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
立即学习“Python免费学习笔记(深入)”;
1. on July 4 I'm going to celebrate a holiday called July 4th! 2. on January 1st it's new years a international holiday! 3. on November 30st I'm going to celebrate my friends birthday
将准确输出前两行,count 值为 2,matches 列表为:
[ '1. on July 4 I\'m going to celebrate a holiday called July 4th!', '2. on January 1st it\'s new years a international holiday!' ]
注意事项:
- 若文件含中文或特殊字符,请显式指定 encoding="utf-8"(Python 3.10+ 默认为 UTF-8,但显式声明更稳妥);
- in 匹配是子串匹配,若需完整单词匹配(如排除 "holidays" 或 "holidaymaker"),应使用正则表达式 re.search(r'\bholiday\b', line, re.I);
- 如需去重、排序或进一步解析(如提取日期),可在 matches 列表上链式操作,保持逻辑解耦。
掌握这一模式,你就能稳健地从任意文本中“按关键词抓整行”,为日志分析、数据清洗和自动化报告打下坚实基础。

















