我使用的是Python 3.2版。请准备以下代码:
for row2 in reader2:
for row1 in reader1:
if row1['identification_column'] == row2['identification_column']:
row2['updated_col'] = row1['updated_col']
writer.writerow(row2)
reader1是一个csv.DictReader对象,如下所示:
identification_column,type
1, bike
2, guitar
3, drums
4, airplane
5, computer
reader2与reader1类似,但文件更长,更全面。
问题在于:
我遍历所有的内部循环,并且,如果程序没有找到匹配,它不会写入行,然后像我想的那样递增外部循环。它就停止了。最初它给我一个错误,直到我读到a post here,其中有人建议在writer声明语句中添加“extrasaction ='ignore'”。但这并没有解决我的问题。
我非常感谢任何修复此逻辑的反馈。在我看来,以下是将要发生的事情:
A)如果内部循环没有从外部循环中找到有问题的值,程序将在外部循环中输出行而不进行任何更改
B)如果内部循环具有外部循环迭代的精确值,则更改行中某列中的值,然后输出该行
我可以看到,因为程序在内循环的第一次迭代后停止,但我不明白为什么会这样。
答案 0 :(得分:3)
reader1
和reader2
是文件对象(包含在csv
DictReader中)。那些迭代器只能被读取一次(直到你在文件的末尾),所以下一个for
循环没有任何东西可以做。
<强>解决方案:强>
将文件读入列表并使用该文件刷新DictReader
:
read_1 = myfile1.readlines()
for row2 in reader2:
reader1 = csv.DictReader(read_1)
for row1 in reader1:
# etc.
更好的是,将csv文件读入一个词典列表 - 这应该更快:
reader1 = list(csv.DictReader(myfile))
for row2 in reader2:
for row1 in reader1:
# etc.
答案 1 :(得分:2)
我对csv
没有经验,但我猜想,一旦你迭代到最后一行,reader
就会用尽,然后你需要重新启动它再次迭代。所以,也许你应该在内循环中使用它之前尝试重新分配reader1
:
for row2 in reader2:
reader1 = csv.DictReader(open('my.csv'), ...)
for row1 in reader1: