2017-02-16 11 views
2

txt出力ファイルから特定の行を抽出しようとしています。私が興味を持っているのは、結果を検索するために使用しているkey_stringの上のほんの少し上の行といくつかの行です。キーストリングは各結果について同じです。Python:リスト内の重複した項目を一意のインデックスで参照する

fi = open('Inputfile.txt') 
fo = open('Outputfile.txt', 'a') 

lines = fi.readlines() 
filtered_list=[] 

for item in lines: 
    if item.startswith("key string"): 
     filtered_list.append(lines[lines.index(item)-2]) 
     filtered_list.append(lines[lines.index(item)+6]) 
     filtered_list.append(lines[lines.index(item)+10]) 
     filtered_list.append(lines[lines.index(item)+11])  
fo.writelines(filtered_list) 

fi.close() 
fo.close() 

出力ファイルには、最初のレコードの右側の行が含まれていますが、利用可能なすべてのレコードに掛けられています。個々のレコードをすべて読み取れるようにインデックスを更新するにはどうすればよいですか?私は解決策を見つけようとしましたが、初心者のプログラマーとしてenumerate()関数またはコレクションパッケージを使用するのに苦労していました。

答えて

1

まず第一に、それはおそらく役立つだろうそれはまったく動かないなど)。とにかく、ここにいくつかの考えがあります。問題をより簡単にするために、サブ問題に分割することができます。この場合、関連する行を収集することからその行を見つけることを分離しましょう。

まず、関連するすべての行のインデックスを見てみましょう。

key = "key string" 
relevant = [] 
for i, item in enumerate(lines): 
    if item.startswith(key): 
     relevant.append(item) 

enumerate実際には非常に簡単です。リストをとり、一連の(インデックス、アイテム)ペアを返します。したがって、enumerate(['a', 'b', 'c'])[(0, 'a'), (1, 'b'), (2, 'c')]を返します。

私は上に書いた何

はリスト内包で達成することができます:

relevant = [i for (i, item) in enumerate(lines) if item.startswith(key)] 

そこで、我々は、関連する行のインデックスを持っています。今、それらを集めましょう。あなたはそれの前に2行、それの後には6と10と11行に興味があります。あなたの最初の行にキーが含まれている場合は、問題があります - 実際にはlines[-1]を必要としません - それが最後の項目です!また、オフセットがリストの最後を過ぎてしまう状況を処理する必要があります。そうしないと、PythonはIndexErrorを生成します。

out = [] 
for r in relevant: 
    for offset in -2, 6, 10, 11: 
     index = r + offset 
     if 0 < index < len(lines): 
      out.append(lines[index]) 

またIndexErrorをキャッチすることができますが、我々はとにかく負のインデックスを処理するために持っているとして、それは、私たちに多くのタイピングを保存しません。

全体のプログラムは次のようになります。返信用

key = "key string" 
with open('Inputfile.txt') as fi: 
    lines = fi.readlines() 

relevant = [i for (i, item) in enumerate(lines) if item.startswith(key)] 
out = [] 
for r in relevant: 
    for offset in -2, 6, 10, 11: 
     index = r + offset 
     if 0 < index < len(lines): 
      out.append(lines[index]) 

with open('Outputfile.txt', 'a') as fi: 
    fi.writelines(out) 
+0

ありがとうRyszard!これはまさに私が探していたものでした。問題は、抽出されたデータが、出力ファイルのレコード数で複製された最初のレコードだけだったことです。これは、python 'list.index'メソッドにはいくつかの制限があるためです。 python 3.6のドキュメントの 'list.index'メソッドの説明の下の部分は、「返されるインデックスは、start引数ではなく、完全なシーケンスの先頭から相対的に計算されます。」 – Bart

0

重複を取り除くには、リストを設定してキャストすることができます。例:

x=['a','b','a'] 
y=set(x) 
print(y) 

になります:あなたは正確にあなたのコード(スタックトレース、と間違って何が起こった場合 [「A」、「B」]

+0

感謝を!しかし、私はこれらの重複が必要なデータを抽出するためのアンカーとして使用する必要があります。残念ながらあなたの答えは私を助けません。 – Bart

関連する問題