Python:linecache没有按预期工作?

2024-10-03 02:39:20 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

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

因此,我为当前目录的5个子目录中的每一个文件提取这一行(也就是说总共有5个文件),我必须把每一行显示的总秒数加起来,然后除以5,得到5个子目录上的值的平均值。在

现在,对于这些平均总数,我编写一个输出文件,其中包含值。如果我有两个目录

^{pr2}$

每个目录都有5个子目录

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

在这些子目录中我有文本文件,这意味着在1/1上有一个什么东西。出去希望里面有“Fin”这个词。如果是的话什么事。时间在1/1文件中提取实时线。然后,我将.time文件的值加总为1/11/2 1/3 1/4 1/5,然后除以5得到平均值。然后我将这个平均值写入一个输出文件。在

我遇到的问题是我使用命令linecache.getline从中提取第二行什么事。时间文件,但这不能正常工作,因为它奇怪地提取了每个子目录上的同一行。所以在子目录1/1上什么事。时间文件为“real 0m1.809s”。我的代码做得很好,但是它会进入1/2子目录并提取什么事。时间奇怪的是,它显示的是相同的“real 0m1.809s”行,但是如果我搜索什么事。时间在1/2的文件中显示它是“real 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

Tags: 文件in目录foriftimeos时间
1条回答
网友
1楼 · 发布于 2024-10-03 02:39:20

很可能是linecache搞乱了你,实际上caching是上次一个类似命名文件中的一行。在

另外,看起来您没有使用完整的文件路径,因此您可能打开了一个与预期不同的文件。在

例如,如果不使用f_v,您需要执行以下操作:

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

尝试将linecache.getline替换为以下内容:

^{pr2}$

与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

相关问题 更多 >