簡體   English   中英

使用python將匹配的行追加到csv文件中

[英]Batch Appending matching rows to csv files using python

我有一組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文件,但是它們都為空。 問題似乎是我的第二個“ if”語句從不正確:控制台從不打印“ Ok!”。 我嘗試了一些故障排除,但感到非常沮喪。 也許最令人沮喪的是,在程序完成后,如果我輸入

   rockid==newentry

控制台返回“ True”,所以在我看來我應該至少得到一個“ Ok!”。 最后的迭代。 誰能幫我找出問題所在?

另外,由於我的if語句永遠不會為真,因此附加“ new_data”的方式也可能存在問題。

您只打開rocreader一次,因此,當您在循環中稍后嘗試使用它時,您只會在第一次使用時從中讀取行-在循環的其余運行中,您正在讀取0行(當然沒有匹配項)。 要反復閱讀,請在每次需要使用時打開和關閉一次。

但是,與其從磁盤上重新掃描地面真相文件(慢!),對於其他CSV的每一行,您都應該將其讀入字典一次,這樣您就可以一步查找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`

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM