我有一組csv文件和另一個csv文件GroundTruth2010_edited_copy.csv,它包含我想要追加到文件集行的末尾的信息。這些文件包含描述地質樣本的信息。對於包括GroundTruth2010_edited_copy.csv在內的所有文件,每行都有一個識別樣本的標識「rockid」,行的其餘部分描述樣本的各種參數。我想從GroundTruth2010_edited_copy.csv追加相應的信息到csv文件集。也就是說,如果行具有相同的「rockid」,我想將它們合併到新的csv文件中的新行中。因此,Set中的每個原始csv文件都有一個新的csv文件。這是我的代碼。批量使用python將匹配行添加到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
控制檯返回「真」,所以在我看來,我應該得到至少一個「好!」進行最後的迭代。任何人都可以幫我找到有什麼問題嗎?
此外,由於我的if語句從不是真的,所以我追加'new_data'的方式可能也有問題。
是什麼原因,你勸使用字典而不是for循環?我嘗試了兩種方法,發現他們花費的時間相同(不過,我在執行字典方法時正在運行一些其他程序)。這應該是預期的嗎?這是一種風格還是易於編碼的問題?我只是好奇,並不是想說你的方法在任何方面都是錯誤的。 – PatEugene
如果GroundTruth有1000行,並且每行有2000行的10個CSV文件,則您的代碼將讀取GroundTruth 20,000次(每個新行一次)並進行20,000,000次比較;我的代碼讀取一次,並進行20,000次查找。如果你看不出有什麼不同,你的測試一定是太小了,或者你的測量不準確。或者你的代碼仍然不必要地重讀GroundTruth? – alexis
我不明白的是,除了進行1000次比較之外,查找還做了些什麼。如果條目包含在字典中,還能知道其他什麼?當查找發現它正在查找的內容時,查找是否會停止比較? – PatEugene