You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python日志捕获、文件检索及CSV输出需求求助与代码调试

问题解决与优化方案

一、现有代码的问题修复

你的代码无输出主要有3个核心问题,修正后即可正常匹配:

  1. 未定义rootdir变量:必须指定递归搜索的根目录,比如当前目录用rootdir = ".",或实际路径如rootdir = "/home/user/project"
  2. readlines()保留换行符:读取unsupported.txt时,每行末尾带\n会导致匹配失败,需去掉空白字符
  3. 匹配逻辑完全颠倒:any(ext in ba1 for ext in line)的逻辑是“检查当前行的每个字符是否在fp列表里”,完全不符合需求,应改为“检查当前行是否包含列表里的任意一个fp1”

修复后的基础匹配代码:

import os

# 指定搜索根目录
rootdir = "."  # 替换为你的实际路径

# 读取并处理fp1列表,过滤空行并去掉换行
with open('unsupported.txt', 'r') as ba:
    fp_list = [line.strip() for line in ba if line.strip()]

# 递归搜索*.foo123文件
for folder, _, files in os.walk(rootdir):
    for file in files:
        if file.endswith('.foo123'):
            fullpath = os.path.join(folder, file)
            with open(fullpath, 'r') as f:
                content = f.read()  # 一次性读文件效率更高,适合小文件
                for fp1 in fp_list:
                    if fp1 in content:
                        print(f"匹配到fp1: {fp1},文件路径: {fullpath}")

二、完整需求实现(关联日志字段+输出CSV)

要满足从日志提取字段、关联匹配、输出指定格式CSV的完整需求,代码如下:

import os
import re
import csv

# ----------------------
# 步骤1:解析error.log,提取fp1及关联字段
# ----------------------
log_fields = {}  # 存储结构:key=fp1,value=(title1, url1, version1, reason1)
# 请根据error.log的实际格式调整正则规则,确保能匹配多行事件
log_pattern = re.compile(
    r'title1: (\S+).*?url1: (\S+).*?version1: (\S+).*?fp1: (\S+).*?reason1: (\S+)',
    re.DOTALL  # 允许匹配多行内容
)

with open('error.log', 'r') as log_file:
    log_content = log_file.read()
    matches = log_pattern.finditer(log_content)
    for match in matches:
        title1 = match.group(1)
        url1 = match.group(2)
        version1 = match.group(3)
        fp1 = match.group(4)
        reason1 = match.group(5)
        log_fields[fp1] = (title1, url1, version1, reason1)

# ----------------------
# 步骤2:递归搜索文件,匹配fp1并提取路径字段
# ----------------------
rootdir = "."  # 替换为你的搜索根目录
output_rows = []

for folder, _, files in os.walk(rootdir):
    for file in files:
        if file.endswith('.foo123'):
            fullpath = os.path.join(folder, file)
            # 从路径提取fp2、fp3、fname(请根据你的实际路径结构调整索引)
            # 示例假设路径格式:/xxx/fp2/fp3/fname.foo123
            path_parts = os.path.normpath(folder).split(os.sep)
            if len(path_parts) >= 3:
                fp2 = path_parts[-3]
                fp3 = path_parts[-2]
                fname = os.path.splitext(file)[0]
            else:
                fp2 = "unknown"
                fp3 = "unknown"
                fname = os.path.splitext(file)[0]
            
            # 匹配文件内容中的fp1
            with open(fullpath, 'r') as f:
                content = f.read()
                for fp1, fields in log_fields.items():
                    if fp1 in content:
                        title1, url1, version1, reason1 = fields
                        output_rows.append([fp2, fp3, fname, title1, version1, reason1, url1])

# ----------------------
# 步骤3:输出CSV文件
# ----------------------
with open('result.csv', 'w', newline='', encoding='utf-8') as csv_file:
    writer = csv.writer(csv_file)
    writer.writerow(["fp2", "fp3", "fname", "title1", "version1", "reason1", "url1"])
    writer.writerows(output_rows)

print(f"处理完成,结果已保存到result.csv,共{len(output_rows)}条数据")

关键说明:

  • 正则表达式需根据error.log的实际格式调整,确保能准确捕获所有字段
  • 路径提取逻辑(fp2、fp3、fname)要对应你的实际文件路径结构修改索引
  • 使用csv模块输出可避免手动拼接逗号导致的格式错误

三、新手学习资料推荐

  • Python官方基础教程:重点学习文件操作、正则表达式、os模块、csv模块章节,是最权威的入门参考
  • 《Python编程:从入门到实践》:实战型入门书籍,前半部分讲基础语法,后半部分有实际项目练习,适合新手快速上手
  • 正则表达式入门:先掌握Pythonre模块的基础用法,再通过匹配实际日志内容巩固,比如练习提取日志中的各类字段
  • Python标准库文档:遇到模块用法疑问时直接查阅,比如os.walk、csv.writer的详细参数说明

内容的提问来源于stack exchange,提问作者myCodeIsJanky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 13:01:07