2017-03-29 13 views
1

かなりシンプルなものを試していますが、わかりません。 基本的に私は私が何をしたいのか、このフォームテキストファイルの行を繰り返し処理しようとすると問題が発生する

Text Accuracy: 0.568221 F1 = 22 recall=0.54 
with paramters A=xxx B=11 C=222... 
============================= 
Text Accuracy: 0.568221 F1 = 22 recall=0.54 
with paramters A=xxx B=11 C=222... 
============================= 
Text Accuracy: 0.568221 F1 = 22 recall=0.54 
with paramters A=xxx B=11 C=222... 
============================= 
Text Accuracy: 0.568221 F1 = 22 recall=0.54 
with paramters A=xxx B=11 C=222... 
============================= 
Text Accuracy: 0.568221 F1 = 22 recall=0.54 
with paramters A=xxx B=11 C=222... 
============================= 

とテキストで満たされているファイルを持っているが、別のファイルに0.90以上の精度を持っている3行のすべてのブロックを書き込みます。 解決策を使用したラインをナビゲートするには、hereを提案してください。 私のコードは以下の通りです:ここで出発し

with open('G:\Mayeul\Distribution images\Features_importance\LogDecisionTree.txt') as oldfile, open('G:\Mayeul\Distribution images\Features_importance\LogDecisionTree2.txt', 'w') as newfile: 
    #print(len(oldfile.readlines())) 
    for line in range(1,int(len(oldfile.readlines()))): 
     print(line) 
     if line%3==0: 
      f=oldfile.readlines()[line-2] 
      f=f.split(' ')[3] 
      if int(f)>0.90: 
       newfile.write(oldfile.readlines()[line-2]) 
       newfile.write(oldfile.readlines()[line-1]) 
       newfile.write(oldfile.readlines()[line]) 

私は理解していない2つの問題を持っている... 最初のものは、私は長さを印刷するよう、私は理解していない

f=oldfile.readlines()[line-2] IndexError: list index out of range

ですそれは13599であり、私のモジュロは3-2 = 1であり、負の数はありません。

2番目の問題は、私が前に覚えていなかったのは、print(len(oldfile.readlines()))行のコメントを外すと、値は、しかしそれから停止する何もしない。それはあなたがoldfile.readlines()を複数回使用することはできませんループのため....
Thxを

答えて

2

ファイル全体をメモリにロードする理由はありません。後で巨大なファイルを処理したい場合は、無駄なリソースの問題を引き起こす可能性があります。

with open('G:\Mayeul\Distribution images\Features_importance\LogDecisionTree.txt') as oldfile, open('G:\Mayeul\Distribution images\Features_importance\LogDecisionTree2.txt', 'w') as newfile: 
    #print(len(oldfile.readlines())) 
    oldlines = [None] * 3 # reserve a storage for 3 lines 
    for linenum, line in enumerate(oldfile, 1): 
     oldlines[linenum%3] = line # actually store the line 
     if linenum%3==0: 
      f = oldlines[1] 
      f=f.split(' ')[2] 
      if float(f)>0.90: 
       newfile.write(oldlines[1]) 
       newfile.write(oldlines[2]) 
       newfile.write(oldlines[0]) 
+0

これは機能します(私は@PM 2Ringの浮動小数点問題を修正しました。 –

0

に入らないよう印刷がプログラムを殺しているみたいです。その代わりの

、次のように変数にファイルの内容を割り当てる:

contentOfTheFile = oldfile.readlines() 

及びコードに代えてoldfile.readlines()のこの変数を使用します。

+0

もちろん、(ログファイルを読み取っているときなど)3行を保存するだけです。 'oldfile.readlines()'を複数回使用する意味は、@Mayeul sgcが期待するものと一致しません。 – phihag

2

readlines()は、ファイルポインタをファイルの末尾に進めるため、その間にファイルが拡大されていない限り、それ以上の呼び出しは何も起こりません。代わりに、すべての行をメモリに読み込み(the iterator protocolを使用)、インデックスを作成します。また、解析が正しくありません。

# Make sure to correctly escape backslashes! 
old_fn = 'G:\\Mayeul\\Distribution images\\Features_importance\\LogDecisionTree.txt' 
new_fn = 'G:\\Mayeul\\Distribution images\\Features_importance\\LogDecisionTree2.txt' 

with open(old_fn) as oldfile: 
    old_lines = list(oldfile) 

with open(new_fn, 'w') as newfile: 
    print(len(old_lines)) 
    for line in range(1, len(old_lines)): 
     print(line) 
     if line % 3 == 0: 
      f = old_lines[line-2] 
      accuracy = f.split(' ')[2] 
      if float(accuracy) > 0.90: 
       newfile.write(old_lines[line-2]) 
       newfile.write(old_lines[line-1]) 
       newfile.write(old_lines[line]) 
+0

@ PM2Ringノートをありがとう!一定。 – phihag

0

これを試してください。

f = open("Input file path") 

l = f.read().split("=============================") 

for each_line in l: 
    if each_line.strip(): 
     print(each_line.split()[2]) 

f.close() 
関連する問題