Python遍历多目录.OUTPUT文件按条件搜索信息问题求助
问题排查:遍历目录提取.OUTPUT文件指定信息失败
需求说明
- 遍历
/user/data/2022/test及其所有子目录下的.OUTPUT文件 - 仅当文件中存在
Test Time时,提取对应的Runtime信息并写入CSV - 当前问题:代码仅读取了一个文件,未按预期执行
原代码
import os import os.path import csv path = '/user/data/2022/test' foutput = [f for f in os.listdir(path) if f.endswith('.OUTPUT')] fout = open('Res', 'w') fieldnames =['Design', 'Run time', 'Test Time'] writer = csv.DictWriter(fout, fieldnames=fieldnames) writer.writeheader() for root,dirs,files in os.walk(path): for file in [f for f in files if f.endswith(".OUTPUT")]: with open(os.path.join(root,file), 'r') as fin: lines = fin.readline() for line in lines: flag = 0 if(line.find('Test time')): flag =1 # set a flag when I got TestTime TestTime = line.split()# save my test time data, and ask keep reading from current file to search 'Run time' continue if(line.find('phys_opt_design: Time (s):') and flag == 1): RunTime = line.split(":") writer.writerow({'Design': fin.name, 'Test time': TestTime[5], 'Run time':RunTime[0] }) fin.close() fout.close()
核心问题及修复方案
1. 文件内容读取错误
fin.readline()仅读取文件第一行,后续遍历lines实际是遍历该行的每个字符,导致文件只处理了第一行就结束。
- 修复:改为读取全部行
lines = fin.readlines(),或者直接遍历文件对象(更高效):for line in fin:
2. 标志位初始化位置错误
flag = 0放在行遍历循环内,每读一行就重置标志位,即使找到Test time,下一行也会清零flag,无法匹配后续的Runtime。
- 修复:将
flag = 0移到打开文件之后、行遍历之前。
3. find()判断逻辑反转
str.find()找不到目标时返回-1,Python中-1被视为True,导致原代码逻辑和预期相反:找不到Test time时才执行代码块。
- 修复:改为
if 'Test time' in line:(更直观),或if line.find('Test time') != -1:
4. 冗余的文件关闭操作
使用with open(...) as fin:时,代码块结束后文件会自动关闭,fin.close()属于冗余操作,甚至会报错(fin在with块外已失效)。
- 修复:删除
fin.close()这一行。
5. 无效变量占用
foutput变量定义后未使用,属于无效代码,可直接删除。
6. 字段名大小写不匹配
fieldnames中是'Test Time',但写入CSV时用的是'Test time',会导致列名不对应。
- 修复:统一大小写,比如都改为
'Test Time'。
7. 索引越界风险
如果目标行格式不符合预期,TestTime[5]或RunTime[0]可能抛出索引错误,建议添加长度判断或异常处理。
修复后的完整代码
import os import csv path = '/user/data/2022/test' with open('Res', 'w', newline='') as fout: fieldnames = ['Design', 'Run time', 'Test Time'] writer = csv.DictWriter(fout, fieldnames=fieldnames) writer.writeheader() for root, dirs, files in os.walk(path): for file in [f for f in files if f.endswith(".OUTPUT")]: file_path = os.path.join(root, file) flag = 0 test_time = '' with open(file_path, 'r') as fin: for line in fin: line = line.strip() if 'Test time' in line: flag = 1 parts = line.split() # 确保索引存在再取值 if len(parts) >= 6: test_time = parts[5] continue if flag == 1 and 'phys_opt_design: Time (s):' in line: run_time = line.split(":")[0].strip() writer.writerow({ 'Design': file_path, 'Test Time': test_time, 'Run time': run_time }) # 找到后可重置flag,避免重复匹配 flag = 0
内容的提问来源于stack exchange,提问作者elmirage888
相关产品推荐
相关产品推荐

