3

こんにちは、いくつかのディレクトリをトラバースし、それらのディレクトリ内のいくつかのファイル内の情報を抽出するために使用する必要があるこの python スクリプトがあります。

だから私は多くのディレクトリを持っています。これらの各ディレクトリ内には、さらに 5 つのサブディレクトリがあります。これら 5 つのサブディレクトリのそれぞれに、3 つのテキスト ファイルがあります。1 つは無視する .txt で、もう 1 つは .out で、「Fin」という単語が 1 行に含まれているかどうかを確認するために読む必要があります。その行がある場合、拡張子が .time の残りのファイルを読み取る必要があります。このファイルには、Unix の time コマンドの出力が次のように含まれています。

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

このファイルから、そのファイルの 2 行目 (実数 0m1.185s) であるリアルタイム行を抽出する必要があります。最初の行は '\n' です。

したがって、現在のディレクトリの 5 つのサブディレクトリ (つまり、合計 5 つのファイル) にあるファイルごとにこの行を抽出し、各ファイルの各行が示す合計秒数を合計してから、5 で割る必要があります。 5 つのサブディレクトリの値の平均を取得します。

これらの平均合計のそれぞれについて、値を含む出力ファイルを作成します。したがって、2つのディレクトリがある場合

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 には、"Fin" という単語が含まれていると思われる something.out ファイルがあります。もしそうなら、1/1にsomething.timeファイルがあり、そこからリアルタイムラインを抽出します。次に、.time ファイルの値を 1/1 1/2 1/3 1/4 1/5 で合計し、5 で割って平均を求めます。次に、この平均を出力ファイルに書き込みます。

私が抱えている問題は、コマンド linecache.getline を使用して something.time ファイルから2行目を抽出することですが、各サブディレクトリで同じ行を奇妙に抽出するため、正しく機能しません。したがって、サブディレクトリ 1/1 では、something.time ファイルの 2 行目は "real 0m1.809s" です。私のコードはこれを正常に実行しますが、1/2 サブディレクトリに移動し、そこで something.time ファイルの 2 行目を抽出します。不思議なことに、それは同じ「実際の 0m1.809s」行ですが、何かに引っかかると表示されます。 1/2 の time ファイルを見ると、「本当の 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 に答える