Python日志捕获、文件检索及CSV输出需求求助与代码调试
问题解决与优化方案
一、现有代码的问题修复
你的代码无输出主要有3个核心问题,修正后即可正常匹配:
- 未定义
rootdir变量:必须指定递归搜索的根目录,比如当前目录用rootdir = ".",或实际路径如rootdir = "/home/user/project" readlines()保留换行符:读取unsupported.txt时,每行末尾带\n会导致匹配失败,需去掉空白字符- 匹配逻辑完全颠倒:
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编程:从入门到实践》:实战型入门书籍,前半部分讲基础语法,后半部分有实际项目练习,适合新手快速上手
- 正则表达式入门:先掌握Python
re模块的基础用法,再通过匹配实际日志内容巩固,比如练习提取日志中的各类字段 - Python标准库文档:遇到模块用法疑问时直接查阅,比如
os.walk、csv.writer的详细参数说明
内容的提问来源于stack exchange,提问作者myCodeIsJanky
相关产品推荐
相关产品推荐

