Python:linecache没有按预期工作?

时间:2014-08-04 20:57:51

标签: python linecache

您好我有这个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文件,我从中提取实时时间线。然后我将.time文件的值总和为1/1 1/2 1/3 1/4 1/5并将它们除以5得到平均值。然后我将此平均值写入输出文件。

我遇到的问题是我使用命令linecache.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

1 个答案:

答案 0 :(得分: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