2017-11-09 12 views
0

なぜこれが機能しないのかわからない - 私のループは最初の反復でうまく動作するが、停止する - x [0]を出力するたびに動作するが、初めて...任意のアイデア? Pythonでforループが最初の反復後に停止する -

csv_reader=csv.reader(guuids, delimiter='\t') 
    matrix_reader=csv.reader(matrix, delimiter='\t')   

    for line in csv_reader: 
      x = line 
      print x[0] 
      for mline in matrix_reader: 
        if x[0] in mline[0] or x[0] in mline[1]: 
          out.append(mline) 
+3

'matrix_reader'とは何ですか? –

+1

'matrix_reader'の先頭に戻ってみましたか? –

+1

'matrix_reader'の内容は何ですか? – Jerrybibo

答えて

1

多くの反復可能なオブジェクト - あなたは、forループでin後に入れることができ、物事 - 一回だけしか巡回することができます。その後、彼らは完了です。彼らは初めに戻ることはできませんし、それらを反復しようとするそれ以上の試みは、何も含まれていないかのように行動します。 A csv.readerオブジェクトはこれの1つの例です。外側ループの最初の反復では、matrix_readerが提供できるすべての利用可能なレコードを反復処理します。そのため、次にコードがその行に来ると、matrix_readerが空であるかのように見えます。

おそらく、これを解決する最も簡単な方法は、反復処理を行うたびに新しいmatrix_readerを作成することです。これと同じように:csv.readerはあなたが一度それを通過した後、あなたはcsv.readerないを行うことを知っている必要があります尽くさ理由を理解することは

for line in csv_reader: 
    matrix_reader = ... 
    for mline in matrix_reader: 
     ... 

は、CSVファイルを表します。実際、名前にもかかわらず、それは本当に「コンバータ」のほうです。何らかのソースから何らかのテキストが取り込まれ、リストに変換されます。読者が行を変換した後、読者はそれを忘れてしまいます。これにより、読者オブジェクトは膨大なメモリを使わずに何百万行も処理することができます。

このアプローチのトレードオフは、読者オブジェクトが元に戻って前の行を繰り返すようにテキストのソースを何らかの形で指示できない限り、前に処理した行に戻ることができないことです。しかし、根底にある情報源がそれを行うことができるという保証はありません。たとえば、ソースが他のプログラムの出力である場合、プログラムに戻って古い出力行を繰り返すように指示することはできません。また、ソースがインターネット経由でストリーミングされている場合は、前にストリーミングされた行を繰り返すように伝える必要はありません。読者は古い行にアクセスすることができないので、最後の行になったら唯一の妥当な振る舞いはあたかも何も残っていないかのように振る舞います。

関連する問題