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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 00:25:53