我有一组csv文件和另一个csv文件,GroundTruth2010_edited_copy.csv,其中包含我想要附加到文件集行末尾的信息。这些文件包含描述地质样本的信息。对于所有文件,包括GroundTruth2010_edited_copy.csv,每行都有一个标识“rockid”标识样本,行的其余部分描述样本的各种参数。我想将GroundTruth2010_edited_copy.csv中的相应信息附加到一组csv文件中。也就是说,如果行具有相同的'rockid',我想将它们组合成新csv文件中的新行。因此,Set中的每个原始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',所以在我看来我应该至少得到一个'好吧'!最后的迭代。任何人都可以帮我找到错误吗?
此外,由于我的if语句永远不会成立,因此我追加'new_data'的方式也可能存在问题。
答案 0 :(得分:2)
你只打开rocreader
一次,所以当你试图在循环中稍后使用它时,你只会在第一次通过它时从中获取行 - 在循环的其余部分中,你是读0行(当然没有匹配)。要反复阅读,每次需要使用时都要打开和关闭一次。
但是,不是从磁盘重新扫描Ground Truth文件(慢!),而是为每个其他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`