You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用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

火山引擎 最新活动