对于循环问题

时间:2012-09-21 20:48:21

标签: python

我使用的是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)如果内部循环具有外部循环迭代的精确值,则更改行中某列中的值,然后输出该行

我可以看到,因为程序在内循环的第一次迭代后停止,但我不明白为什么会这样。

2 个答案:

答案 0 :(得分:3)

reader1reader2是文件对象(包含在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: