2

2 つの csv ファイルを比較して、各 csv ファイルから 1 行に product_id フィールドを出力しようとしています。これが問題のコードです。2 つの csv ファイルでは、フィールドが同じ順序になっていないことに注意してください。

import csv
import sys

f1 = sys.argv[1]
f2 = sys.argv[2]
num_matches = 0

with open(f1, 'rb') as f:
    csv_readerf = csv.reader(f)
    csv_readerf.next()
    with open(f2, 'rb') as n:
        csv_readern = csv.reader(n)
        csv_readern.next()
        for row in csv_readerf:
            a_name  = row[0].replace(" ", "").lower()   #not used, can be ommitted
            a_id    = row[1]
            a_post  = row[2]
            a_rev   = row[3]
            a_loc   = row[4]                            #not used, can be ommitted
            a_desc  = row[5].replace(" ", "").lower()   #remove all whitespaces for uniformity
            a_ovr   = row[6]
            a_cmf   = row[7]
            a_sty   = row[8]
            a_siz   = row[9]
            a_arc   = row[10]
            a_wid   = row[11]
            a_url   = row[12]
            for rowP in csv_readern:
                p_name  = rowP[10].replace(" ", "").lower()
                p_id    = rowP[6]

                temp    = rowP[11].split(" ")[0:3]      #disregard time stamp
                p_post  = (" ").join(temp)

                p_rev   = rowP[7]
                if p_rev is "":
                    p_rev = "Anonymous"
                p_desc  = rowP[1].replace(" ", "").replace("\n", "").replace("\r\n", "").lower()
                p_ovr   = rowP[4]
                p_cmf   = rowP[3]
                p_sty   = rowP[0]
                p_siz   = rowP[8]
                p_arc   = rowP[9]
                if p_arc:
                    p_arc = p_arc[0 : p_arc.index(" ")]     #for arch we only want the first word
                p_wid   = rowP[5]
                p_url   = rowP[2]

                print a_id, p_id

私が抱えている問題は、.txt ファイルにダンプした出力に、f1 のすべての product_id が出力されないことです。f1 は私が作成したテスト ファイルであり、意図的に異なる ID のいくつかの製品をそこに配置したため、これは確かです。

注意すべきもう1つのことは、個別のスクリプトで各csvをループしようとしたところ、それぞれが正しく機能し、期待どおりに各product_idを出力したことです。for ループを埋め込むと、最初のファイルの反復処理が短くなったように見えるのはなぜですか? 何が問題なのですか?私が作成したテスト ファイルは小さいので、メモリに完全に収まるはずです。

4

1 に答える 1

2

エラーは、BrenBamがループ構造について言及したようにです

for row in csv_readerf:
   ....
   for rowP in csv_readern:
       # will only work in the first iteration of the outer loop
       # since the csv reader hits eof
       ...

したがって、csv_readerfの最初の行のみをcsv_readernのすべての行と比較するだけです。

外側のループの内側にある内側のループのcsvファイルを開くと、それを防ぐことができます。

for row in csv_readerf:
    ...
    with open(f2, 'rb') as n:
       csv_readern = csv.reader(n)
       csv_readern.next()       ....

        for rowP in csv_readern:
           # will iterate over csv_readern, but only in the first iteration of the outer loop

または、最初に内部ファイルを配列に読み込んで、それをループする場合

これは非常に一般的な初心者のエラーであり、深いネストでよく発生します。関数を使用すると役立つ場合があります

于 2012-09-07T08:43:13.380 に答える