在Python中查找并打印文件中所有包含指定字符串的行,核心逻辑是先读取文件内容,再逐行判断行内是否包含目标字符串,最后输出符合条件的行。这种操作在日常日志分析、数据筛选场景中非常实用。
基础实现方法
最基础的实现方式是使用open函数打开文件,通过readlines方法获取所有行,再遍历判断每行是否包含目标字符串。需要注意的是,readlines读取的每一行末尾会包含换行符,匹配时可以根据需求处理。
# 定义目标文件路径和目标字符串
file_path = "test.txt"
target_str = "error"
# 打开文件并读取所有行
with open(file_path, "r", encoding="utf-8") as f:
lines = f.readlines()
# 遍历所有行,判断是否包含目标字符串
for line_num, line in enumerate(lines, start=1):
if target_str in line:
# 打印行号和行内容,去除末尾换行符
print(f"第{line_num}行:{line.strip()}")
逐行读取的优化方法
如果文件体积较大,使用readlines一次性读取所有内容会占用较多内存,此时可以采用逐行读取的方式,每读一行就判断一次,减少内存消耗。
file_path = "test.txt"
target_str = "warning"
with open(file_path, "r", encoding="utf-8") as f:
line_num = 1
# 逐行遍历文件对象
for line in f:
if target_str in line:
print(f"第{line_num}行:{line.strip()}")
line_num += 1
支持忽略大小写的匹配
如果需要忽略大小写进行匹配,可以先将行内容和目标字符串都转为小写(或大写)再判断,避免大小写差异导致的匹配遗漏。
file_path = "test.txt"
target_str = "info"
# 将目标字符串转为小写,方便忽略大小写匹配
target_lower = target_str.lower()
with open(file_path, "r", encoding="utf-8") as f:
for line_num, line in enumerate(f, start=1):
# 将行内容转为小写后判断
if target_lower in line.lower():
print(f"第{line_num}行:{line.strip()}")
注意事项
- 文件路径需要正确,相对路径是相对于当前运行脚本的目录,也可以使用绝对路径避免路径错误。
- 文件编码需要和实际文件编码一致,常见的中文编码有utf-8、gbk,如果编码不匹配会抛出解码错误。
- 如果目标字符串包含特殊字符,比如换行符、制表符,匹配时需要对应处理,避免匹配失败。
- 如果文件不存在,
open函数会抛出FileNotFoundError,实际使用中可以根据需求添加异常处理逻辑。
异常处理示例
添加异常处理可以让程序更健壮,避免因为文件不存在或者编码错误导致程序崩溃。
file_path = "test.txt"
target_str = "debug"
try:
with open(file_path, "r", encoding="utf-8") as f:
for line_num, line in enumerate(f, start=1):
if target_str in line:
print(f"第{line_num}行:{line.strip()}")
except FileNotFoundError:
print(f"错误:文件{file_path}不存在")
except UnicodeDecodeError:
print("错误:文件编码不匹配,请检查文件编码")