如何用Python递归查找目录中以excel开头的行并输出到日志文件
解决Python递归遍历目录查找指定前缀行的问题
嘿,我来帮你搞定这个需求!咱们要实现的是递归遍历/batch/目录及其所有子目录,找出所有以excel开头的行,然后按文件归类把结果写入logfile,没有匹配行的文件就不记录。下面是完整的实现代码,还有关键部分的解释:
完整代码
import os from os.path import join # 定义要查找的目标前缀 target_prefix = "excel" # 结果输出文件名称 output_filename = "logfile" # 打开输出文件,用'w'模式会覆盖原有内容,若需要追加历史结果可改用'a' with open(output_filename, 'w', encoding='utf-8') as log_file: # 递归遍历/batch/目录:os.walk返回当前目录名、子目录列表、文件列表 for dirname, _, files in os.walk('/batch/'): for filename in files: # 拼接完整的文件路径,避免跨平台路径问题 full_file_path = join(dirname, filename) matched_lines = [] try: # 打开当前文件逐行读取 with open(full_file_path, 'r', encoding='utf-8') as file: # enumerate可以同时获取行号,方便定位内容位置 for line_num, line in enumerate(file, start=1): # 检查行是否以目标前缀开头(保留原行内容,仅去掉末尾换行符) if line.startswith(target_prefix): matched_lines.append(f"{line.rstrip('\n')} (行号: {line_num})") except Exception as e: # 处理文件读取异常,比如二进制文件、权限不足等情况 print(f"⚠️ 无法读取文件 {full_file_path}: {str(e)}") continue # 只有当当前文件有匹配行时,才写入结果文件 if matched_lines: log_file.write(f"📄 {full_file_path}:\n") for line in matched_lines: log_file.write(f" - {line}\n") log_file.write("\n") # 不同文件的结果之间加空行分隔,更易读
关键细节说明
- 递归遍历目录:用
os.walk('/batch/')可以轻松实现递归遍历,它会自动处理所有子目录,不用手动写递归函数。 - 文件路径拼接:
join(dirname, filename)确保路径在Windows、Linux等不同系统下都能正常工作,避免手动拼接路径的错误。 - 安全的文件操作:全程使用
with语句处理文件,它会自动帮我们关闭文件,避免资源泄漏。 - 异常处理:加入
try-except块是为了应对各种意外情况,比如遇到二进制文件、没有读取权限的文件时,程序不会直接崩溃,而是给出提示后继续处理其他文件。 - 结果可读性优化:给每个文件的结果加上了文件路径、行号,还用缩进和空行分隔,让输出的
logfile更易读。
如果你的需求是忽略行首的空白字符(比如空格、制表符)再检查前缀,可以把line.startswith(target_prefix)改成line.lstrip().startswith(target_prefix),根据实际需求调整即可。
内容的提问来源于stack exchange,提问作者lakder benmaiza




