1

Python バージョン 3.2 を使用しています。次のコードがあります。

for row2 in reader2:
    for row1 in reader1:
        if row1['identification_column'] == row2['identification_column']:
            row2['updated_col'] = row1['updated_col']
    writer.writerow(row2)

reader1 は、次のような csv.DictReader オブジェクトです。

    identification_column,type

    1, bike                       
    2, guitar
    3, drums
    4, airplane
    5, computer

reader2 は、より長く、より包括的なファイルを除いて、reader1 に似ています。

問題はこれです:

内側のループをすべて実行し、一致するものが見つからない場合、プログラムは行を書き込まず、思ったように外側のループをインクリメントします。止まるだけです。ここで誰かが「extrasaction = 'ignore'」をライター宣言ステートメントに追加することを提案した投稿を読むまで、最初はエラーが発生しました。しかし、それは私の問題を解決しませんでした。

このロジックを修正するためのフィードバックをいただければ幸いです。私の考えでは、次のことが起こっていました。

A) 内側のループが外側のループから問題の値を見つけられない場合、プログラムは外側のループの行を変更せずに出力します。

B) 内側のループに、外側のループが反復している正確な値がある場合、行のいずれかの列の値を変更してから、その行を出力します。

そのままでは、プログラムは内側のループの最初の繰り返しの後に停止するだけですが、なぜそうなのかわかりません。

4

2 に答える 2

3

reader1およびreader2ファイルオブジェクトです(csvDictReaderにラップされています)。これらは (ファイルの最後に到達するまで) 1 回だけ読み取ることができる反復子であるため、次のforループでは何もする必要がありません。

解決:

ファイルをリストに読み込み、それを使用して更新しDictReaderます。

read_1 = myfile1.readlines()
for row2 in reader2:
    reader1 = csv.DictReader(read_1)
    for row1 in reader1:
        # etc.

さらに良いことに、そのcsvファイルを辞書のリストに一度読み込みます-それはより速いはずです:

reader1 = list(csv.DictReader(myfile))
for row2 in reader2:
    for row1 in reader1:
        # etc.
于 2012-09-21T20:54:16.137 に答える
2

の経験はありませんcsvreader、最後の行まで反復すると が使い果たされ、再度反復するには再起動する必要があると思います。reader1したがって、内側のループで使用する前に、再割り当てを試みる必要があります。

for row2 in reader2:
    reader1 = csv.DictReader(open('my.csv'), ...)
    for row1 in reader1:
于 2012-09-21T20:54:08.363 に答える