2017-02-15 5 views
1

ファイル内の特定のインデックスの要素のリストを探したいと思います。特定のインデックスのファイル内のリスト値(例:[1,2,3])のすべてのインスタンスを見つける方法

がexについては、下記の私は2列で順番に発生した値[1,2,3]のリストを見つける必要があり、今ファイル「TEMP.TXT」

line_0 1 
line_1 2 
line_2 3 
line_3 4 
line_4 1 
line_5 1 
line_6 2 
line_7 1 
line_8 2 
line_9 3 
line_10 4 

の内容です上記の各行のファイル

出力は以下のようになります。

line_2 3 
line_9 3 

が、私は以下のロジックを試してみましたが、それいくつかは、どのように動作していない。(

inf = open("temp.txt", "rt") 
    count = 0 
    pos = 0 
    ListSeq = ["1","2","3"] 
    for line_no, line in enumerate(inf): 
     arr = line.split() 
     if len(arr) > 1: 
     if count == 1 : 
      pos = line_no 
     if ListSeq[count] == arr[1] : 
      count += 1 
     elif count > 0 : 
      inf.seek(pos) 
      line_no = pos 
      count = 0 
     else : 
      count = 0    
     if count >= 3 : 
     print(line) 
     count = 0 

誰かが上記のコードで問題を見つけることで私を助けることができますまたは正しい出力を与える別のロジックでさえも問題ありません。

+0

*各行のインデックス2に順番に出現しています* - あなたは詳しく説明できますか? – RomanPerekhrest

+0

@RomanPerekhrest:私は質問を編集しました。つまり、インデックス2ではなく、列2を意味します。 – programmerDaemon

答えて

1

コードに欠陥があります。最も顕著なバグ:行番号を使ってテキストファイルにseekにしようとすると、決してうまくいかず、バイトオフセットを使用する必要があります。あなたがそれをしたとしても、あなたが行を反復しているので間違っているので、その間にファイルポインタを変更しようとすべきではありません。

私のアプローチ:

アイデアは、垂直方向のベクトルで動作するようにあなたのファイルを「転置」第二垂直ベクトルのシーケンスを見つけ、最初の垂直ベクトル上のデータを抽出することが分かったインデックスを使用することです。

split行を取得するには& number、結果を圧縮して2つのベクトルを得る:1の数字の1のテキスト。この時点で

は、1つのリストは ["line_0","line_1",...]含まれており、他の一つは ["1","2","3","4",...]

は、番号リスト内のシーケンスのインデックスを検索し、見つけたときにカップルのTXT /番号を印刷含まれています。

コード:

with open("text.txt") as f: 
    sequence = ('1','2','3') 
    txt,nums = list(zip(*(l.split()[:2] for l in f))) # [:2] in case there are more columns 
    for i in range(len(nums)-len(sequence)+1): 
     if nums[i:i+len(sequence)]==sequence: 
      print("{} {}".format(txt[i+2],nums[i+2])) 

結果:

line_2 3 
line_9 3 

最後forループはタプルを生成するために、リスト内包によって置き換えることができます。

result = [(txt[i+2],nums[i+2]) for i in range(len(nums)-len(sequence)) if nums[i:i+len(sequence)]==sequence ] 

結果:

[('line_2', '3'), ('line_9', '3')] 
+0

これは意図した出力を与えています。しかし、私はPythonの初心者であるため、ロジックを理解するのがほとんど難しいと感じています。私はこの答えを受け入れる前に、もっと簡単な解決法(時間は私にとっては制約ではありません)を探します。 -Thanks – programmerDaemon

+0

私の編集より、私はもう少し説明を加えました –

+0

それは今より明らかです。 – programmerDaemon

1

任意のシーケンスと任意の列の一般化

sequence = ['1','2','3'] 
col = 1 

with open(filename, 'r') as infile: 
    idx = 0 
    for _i, line in enumerate(infile): 
     if line.strip().split()[col] == sequence[idx]: 
      if idx == len(sequence)-1: 
       print(line) 
       idx = 0 
      else: 
       idx += 1 
     else: 
      idx = 0 
+1

int()は例外を発生させる可能性があります – MKesper

+0

これは私が探している出力を与えません、投稿に記載されている出力形式を参照してください。 各行の2番目の列で[1,2,3]の配列を見つけなければならず、配列が見つかるとその要素のインデックスを表示する必要があります。 – programmerDaemon

+0

@programmerDaemon私はあなたの質問を読み直し、それに応じて自分のコードを変更しました。あなたが探している出力形式は不明です。_index_または行全体を印刷したいですか? –

関連する問題