2017-10-27 8 views
0

フォルダ内の複数のファイルを比較し、各行のDDの最大値をフォルダ内の他のファイルの対応する行。例:フォルダに10個のファイルがあり、その中にDD =いくつかの浮動小数点数の行が含まれています。-0.903999と書いてあります。フォーマットはDD = -0.903999である。それぞれの値はもちろん違います。私が期待した結果は、ファイル3などにFILE2LINE1file1のにライン1ライン1を比較した後、それを印刷しなければならないということです新しいファイルの1行目で最大のDD値を持つ行、2行目と同様です。複数のファイルの行を比較し、最大値を含む各行をファイルに出力する

これまでの結果:ファイルを比較した後に、line1、line2、line3などの最大DDを含む行の代わりに、フォルダ内のすべてのファイルごとに1行の結果しか得られません。私は軌道に乗っているが、ちょうどこの1ビットです。ヘルプここ

いただきありがとうございます、私は(ちょうど2つのファイルと数行で)これまで

resultLines = [] 
    filemaxDD = -999999 
    filemax = "" 
    linemax = "" 

    def myproces(root, file): 
     f = open(os.path.join(root, file)) 
     mylines = f.readlines() 
     maxline = "" 
     maxDD = -999999 
     global filemaxDD 
     global filemax 
     global linemax 

     for line in mylines: 
      if 'DD=' in line: 
       stPos = line.index('DD=') + 4 
       for i, s in enumerate(line):   
        if (s == ';') & (i > stPos):  
         break 
       dd = float(line.__getslice__(stPos, i)) 
       if dd > maxDD: 
        maxDD = dd 
        maxline = line 
     if (maxDD > filemaxDD): 
      filemaxDD = maxDD 
      linemax = maxline 
      filemax = file[:-4] 
    for root, dirs, files in os.walk(dirPath): 
     for file in files: 
      if file.endswith(".txt"): 
       processFile(root, file) 
    resultLines.append(filemax + "  " + linemax) 
    result_file = open('final.txt', 'w') 
    result_file.writelines(resultLines) 
    result_file.close() 

例ファイルを持っているものです。

file 1 contains this: 

#searchE google  yahoo  bing 
    1   0   2   h=1;DD=-0.1;f=0.5;i=3 
    1   0   2   h=2;DD=-0.6;f=1.2;i=1 
    1   0   2   h=1;DD=-0.2;f=0.5;i=3 
    1   0   2   h=2;DD=-0.6;f=1.2;i=1 

file 2: 

#searchE google  yahoo  bing 
    1   0   2   h=1;DD=-0.2;f=0.5;i=3 
    1   0   2   h=2;DD=0.3;f=1.2;i=1 
    1   0   2   h=1;DD=-0.2;f=0.5;i=3 
    1   0   2   h=2;DD=-0.1;f=1.2;i=1 

例えばライン上に与えられた期待結果:代わりreadlinesを用いる

   #searchE google  yahoo  bing 
file1.txt  1   0   2   h=1;DD=-0.1;f=0.5;i=3 
file2.txt  1   0   2   h=1;DD=0.3;f=0.5;i=3 
+2

StackOverflowの最初の質問にようこそ。あなたの問題を示すサンプルファイルと、期待される出力、望ましい出力、エラーメッセージの完全なトレースバックを表示してください。基本的には、どうしてあなたがいかに "つまらない"ように見えるかを見せてください。 [最小限で完全で検証可能なサンプルを作成する方法](http://stackoverflow.com/help/mcve)を読んで従う。 –

+0

おそらく、あなたのアルゴリズムを 'key'-' value '構造体を使って微調整する必要があります。 'DD'とファイルを解析するたびに、値を更新する必要があるかどうかを比較します。 –

+0

なぜこれが下落したのですか? – jackpetes

答えて

1

()Iは、各ファイルを反復処理とを有する行ずつそれらの各々を読み取ることになるメモリにファイル全体をスローする方法読み込まれた行()。

EDIT: [OK]を、あなたは巨大なファイルを扱う、あなたが簡単にメモリにその内容のすべてを投げることができることをされていないと仮定しましょうそれは次のようになります。ここでは、更新スクリプトは次のとおりです。ここで

import os 
path = 'Files' # Path to directory 
directory = os.listdir(path) # Get files in your directory 
lines = [] 


# Forget about readline() method. Just dump all files into memory 
fileData = [] 
for file in directory: 
    with open(path + '\\' + file) as f: 
     contents = f.readlines() 
     fileData.append(contents) 


def formatPrint(file, data): 
    '''Helper function to format print output''' 
    print(file, " %s %s %s h=%s;DD=%s;f=%s;i=%s"%tuple(data)) 

def processString(line, filename): 
    '''Extract useable information from a line in a file''' 
    lineData = line.split() 
    firstThree = lineData[0:3] 
    lastFour = lineData[3].split(';') # Not all values are separated by ' ' 

    # Just some formatting 
    for i in range(len(firstThree)): 
     firstThree[i] = int(firstThree[i]) 

    lastFour[0] = int(lastFour[0][2:]) 
    lastFour[1] = float(lastFour[1][3:]) 
    lastFour[2] = float(lastFour[2][2:]) 
    lastFour[3] = int(lastFour[3][2:]) 

    # Splice both lists together 
    firstThree.extend(lastFour) 
    completeLine = firstThree 

    DD = completeLine[4] 
    return filename, completeLine, DD 

for i in range(len(fileData[0])): 
    DDict = {} # Dictionary DD : filename 
    DataDict= {} # Dictionary filename : data 
    DDList = [] # List to keep track of DDs 
    for k in range(len(fileData)): 
     line = fileData[k][i] 
     if line.strip() != '': 
      f, data, DD = processString(line, directory[k]) 
      DDList.append(DD) 
      DDict[DD] = f 
      DataDict[f] = data 

    maxDD = max(DDList) 
    firstWinner = DDict[maxDD] 
    formatPrint(firstWinner, DataDict[firstWinner]) 

は、ファイルは次のとおりです。

#File 1 
1   0   2   h=1;DD=-0.1;f=0.5;i=3 
1   0   2   h=2;DD=-0.6;f=1.2;i=1 
1   0   2   h=1;DD=-0.2;f=0.5;i=3 
1   0   2   h=2;DD=-0.6;f=1.2;i=1 

#File 2 
1   0   2   h=1;DD=-0.2;f=0.5;i=3 
1   0   2   h=2;DD=0.3;f=1.2;i=1 
1   0   2   h=1;DD=-0.2;f=0.5;i=3 
1   0   2   h=2;DD=-0.1;f=1.2;i=1 

#File 3 
1   0   2   h=1;DD=-0.4;f=0.1;i=3 
1   0   2   h=2;DD=0.2;f=1.2;i=1 
1   0   2   h=1;DD=-0.1;f=0.3;i=2 
1   0   2   h=2;DD=-0.2;f=1.4;i=1 

そして、ここでは出力です:

File_1.txt  1 0 2 h=1;DD=-0.1;f=0.5;i=3 
File_2.txt  1 0 2 h=2;DD=0.3;f=1.2;i=1 
File_3.txt  1 0 2 h=1;DD=-0.1;f=0.3;i=2 
File_2.txt  1 0 2 h=2;DD=-0.1;f=1.2;i=1 

私はこの権利を取得しましたか?

+0

これは速くなると理解していますが、現在の問題をどのように解決するのかを精緻に考えてください。ありがとうございます – jackpetes

+0

これは期待どおりに動作していません。私は何をしようとしていたかについてもっと詳しく説明しました。ありがとうございました – jackpetes

+0

さて、つかまりました。私はあなたにこれに戻ってみましょう! – Enmerkar

関連する問題