3

您好,我有这个 python 脚本,我需要用它来遍历一些目录并在这些目录中的一些文件中提取一些信息。

所以我有很多目录。在这些目录中的每一个中,还有 5 个以上的子目录。在这 5 个子目录中的每一个子目录中,我都有 3 个文本文件。一个是我忽略的.txt,另一个是.out,我需要阅读它以查看它是否有一行带有“Fin”一词。如果它有该行,那么我必须读取具有 .time 扩展名的剩余文件。该文件在 Unix 中具有 time 命令的输出,如下所示:

real    0m1.185s
user    0m0.027s
sys     0m0.026s

从这个文件中,我需要提取实时行,这是该文件的第二行(实际 0m1.185s),第一行是'\n'。

因此,我为当前目录上的 5 个子目录(这意味着总共 5 个文件)上的每个文件提取了这一行,我必须总结每个文件的每一行表示的总秒数,然后将其除以 5 到获得 5 个子目录的平均值。

现在,对于这些平均总数中的每一个,我都会使用该值编写一个输出文件。所以如果我有两个目录

1/
2/

这些目录中的每一个都有 5 个子目录

1/1 1/2 1/3 1/4 1/5
2/2 2/2 2/3 2/4 2/5

在这些子目录中,我有文本文件,这意味着在 1/1 上有一个 something.out 文件,希望里面有单词“Fin”。如果是,那么在 1/1 上有一个 something.time 文件,我从中提取实时行。然后我将 1/1 1/2 1/3 1/4 1/5 中的 .time 文件的值相加,然后将它们除以 5 得到平均值。然后我将此平均值写入输出文件。

我遇到的问题是我使用命令行cache.getline 从something.time 文件中提取第二行,但这不能正常工作,因为它奇怪地在每个子目录中提取了同一行。所以在子目录 1/1 上,something.time 文件的第二行是“real 0m1.809s”。我的代码做得很好,但随后它进入 1/2 子目录并在那里提取了 something.time 文件的第二行,奇怪的是它显示那是相同的“真正的 0m1.809s”行,但如果我进入某个东西。 1/2 的时间文件显示它是“真正的 0m1.009s”。

现在同样的情况发生在 2/ 目录中。它在它进入的第一个子目录中提取文件的第一行,但随后它只是重复该行 5 次。

这是我的代码有人可以指出我的错误在哪里吗?

def proArch(dirArch):
    dirList = os.listdir(dirArch)
    resultado = 0
    valores=[]
    for f in dirList:
       if("out" in f):
          for linea in open(f):
            if "Fin" in linea:
              for f_v in dirList:
                if("time" in f_v):
                  linea=linecache.getline(f_v, 2)
                  valores=re.split("['\tms']",linea)[1:3]
                  resultado=(float(valores[0])*60)+float(valores[1])
                else:
                  print("El archivo "+dirArch+" no se proceso bien.")

    return resultado


dirList_g = os.listdir(".")
dirOrig = os.getcwd()
res_tot=0.0
for d in dirList_g:
    if os.path.isdir(d) == True:
     os.chdir(dirOrig+"/"+d)
     dirAct = os.getcwd()
     dirList_w = os.listdir(".")
     for d_w in dirList_w:
       os.chdir(dirAct+"/"+d_w)
       dirArch = os.getcwd()
       res_tot=res_tot+proArch(dirArch)

     res_tot=res_tot/5
     os.chdir(dirOrig)
     with open("output.txt", "w") as text_file:
        text_file.write(dirAct+" "+str(res_tot)+"\n")
     res_tot=0.0
4

1 回答 1

2

可能linecache是在惹恼您,实际上caching是来自上次类似名称文件的行。

此外,您似乎没有使用完整的文件路径,因此您打开的文件可能与您期望的不同。

例如,f_v您不想使用,而是要执行以下操作:

filepath = os.path.join(<dirname>, <filename>)

尝试用linecache.getline类似的东西替换:

def get_line(filename, n):
    with open(filename, 'r') as f:
        for line_number, line in enumerate(f):
            if line_number == n:
                return line

与 linecache 不同,这实际上会打开文件并每次读取它。

最后,如果您使用以下代码重写这段代码,它可能会更清晰、更容易处理os.walk

https://docs.python.org/2/library/os.html

例如:

import os
for root, dirs, files in os.walk('someplace'):
    for dir in dirs:
        # do something with the dirs
    for file in files:
        # do whatever with the files
于 2014-08-04T21:12:43.460 回答