1

csv ファイルのセットと、別の csv ファイル GroundTruth2010_edited_copy.csv があります。これには、ファイル セットの行の最後に追加したい情報が含まれています。ファイルには、地質サンプルを説明する情報が含まれています。GroundTruth2010_edited_copy.csv を含むすべてのファイルについて、各行にはサンプルを識別する識別用の「rockid」があり、行の残りの部分にはサンプルのさまざまなパラメーターが記述されています。GroundTruth2010_edited_copy.csv から対応する情報を csv ファイルのセットに追加したいと考えています。つまり、行に同じ「rockid」がある場合、それらを新しい csv ファイルの新しい行に結合したいと考えています。したがって、セット内の元の csv ファイルごとに新しい csv ファイルがあります。これが私のコードです。

import os
import csv
#read in ground truth data
csvfilename='GroundTruth/GroundTruth2010_edited_copy.csv'
with open(csvfilename) as csvfile:
    rocreader=csv.reader(csvfile)
    path=os.getcwd()
    filenames = os.listdir(path)
    for filename in filenames:
        if filename.endswith('.csv'):
            #read csv files                   
            r=csv.reader(open(filename))
            new_data = []
            for row in r:
               rockid=row[-1]

                for krow in rocreader:
                    entry=krow[0]
                    newentry=entry[:5] +entry[6:] #remove extra '0' from middle of entry 

                    if newentry==rockid:
                        print('Ok!')
                        #append ground truth data
                        new_data.append([row, krow[1], krow[2], krow[3], krow[4]]) 

            #write csv files          
            newfilename = "".join(filename.split(".csv")) + "_GT.csv"
            with open(newfilename, "w") as f:
                writer = csv.writer(f)
                writer.writerows(new_data) 

コードが実行され、新しい csv ファイルが作成されますが、それらはすべて空です。問題は、私の 2 番目の 'if' ステートメントが真にならないことです。コンソールに 'Ok!' が表示されません。少しトラブルシューティングを試みましたが、かなりイライラしました。おそらく最もイライラするのは、プログラムが終了した後、

   rockid==newentry

コンソールは「True」を返すので、少なくとも 1 つの「OK!」を取得する必要があるように思えます。最後の繰り返しのために。誰が間違っているかを見つけるのを手伝ってくれますか?

また、私の if ステートメントは決して true にならないため、'new_data' を追加する方法にも問題がある可能性があります。

4

1 に答える 1

2

開くrocreaderのは 1 回だけなので、後でループで使用しようとすると、最初から行を取得するだけです。ループの残りの実行では、0 行を読み取っています (そしてもちろん取得しています)。一致しません)。何度も読むには、使用するたびに一度開いて閉じます。

しかし、ディスクからグラウンド トゥルース ファイルを再スキャンして (遅い!)、他の CSV の行ごとにスキャンする代わりに、一度辞書に読み込む必要があります。そうすれば、1 ステップで ID を検索できます。

with open(csvfilename) as csvfile:
    rocreader=csv.reader(csvfile)
    rocindex = dict((row[-1], row) for row in rocreader)

次に、任意のキーnewentryについて、次のように確認できます。

if newentry in rocindex:
    truth = rocindex[newentry]  
    # Merge it with the row that has key `newentry`
于 2013-10-24T21:46:55.983 に答える