多くの反復可能なオブジェクト - あなたは、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ファイルを表します。実際、名前にもかかわらず、それは本当に「コンバータ」のほうです。何らかのソースから何らかのテキストが取り込まれ、リストに変換されます。読者が行を変換した後、読者はそれを忘れてしまいます。これにより、読者オブジェクトは膨大なメモリを使わずに何百万行も処理することができます。
このアプローチのトレードオフは、読者オブジェクトが元に戻って前の行を繰り返すようにテキストのソースを何らかの形で指示できない限り、前に処理した行に戻ることができないことです。しかし、根底にある情報源がそれを行うことができるという保証はありません。たとえば、ソースが他のプログラムの出力である場合、プログラムに戻って古い出力行を繰り返すように指示することはできません。また、ソースがインターネット経由でストリーミングされている場合は、前にストリーミングされた行を繰り返すように伝える必要はありません。読者は古い行にアクセスすることができないので、最後の行になったら唯一の妥当な振る舞いはあたかも何も残っていないかのように振る舞います。
'matrix_reader'とは何ですか? –
'matrix_reader'の先頭に戻ってみましたか? –
'matrix_reader'の内容は何ですか? – Jerrybibo