【问题标题】:For Loop Issues对于循环问题
【发布时间】:2012-09-21 20:48:20
【问题描述】:

我使用的是 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,有人建议在作者声明语句中添加“extrasaction = 'ignore'”。但这并没有解决我的问题。

对于修复此逻辑的任何反馈,我将不胜感激。在我看来,接下来会发生什么:

A) 在内循环没有从外循环中找到有问题的值的情况下,程序输出外循环中的行而没有变化

B) 如果内部循环具有外部循环正在迭代的确切值,请更改该行中某一列的值,然后输出该行

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

【问题讨论】:

    标签: python


    【解决方案1】:

    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.
    

    【讨论】:

    • 谢谢蒂姆。现在就运行它,可能需要一段时间,但至少它仍在运行,所以这是一个非常好的迹象。一定会在完成后立即让您和这里的其他人知道它是否有效。
    • 这很好用,这是一个很好的解决方案。谢谢。
    【解决方案2】:

    我对@9​​87654321@ 没有经验,但我猜reader 在您迭代到最后一行后已经用尽,然后您需要重新启动它以再次迭代。所以,也许你应该在内部循环中使用之前尝试重新分配reader1

    for row2 in reader2:
        reader1 = csv.DictReader(open('my.csv'), ...)
        for row1 in reader1:
    

    【讨论】:

    • 这可以通过使用with 语句来改进——就目前而言,my.csv 永远不会关闭。
    猜你喜欢
    • 2011-07-15
    • 2018-05-31
    • 2012-01-14
    • 2017-12-10
    • 2016-01-24
    • 1970-01-01
    • 2020-11-07
    • 2017-09-24
    相关资源
    最近更新 更多