Python多次循环字典

时间:2014-04-17 17:25:22

标签: python csv dictionary

我的问题来自一个更大的计划,但为了这个问题,我缩小并大大简化了具体问题。

我使用了dictreader方法从csv文件创建字典。我想循环遍历字典打印出来的内容,我可以,但我想多次这样做。

test.csv的内容只是一列,数字为1-3,标题行为Number。

GetData是一个带有一个名为create_dict()的方法的类,我编写该方法,使用csv.dictreader创建并从test.csv返回一个字典

我的代码如下:

dictionary = GetData('test.csv').create_dict()

for i in range(5):
    print("outer loop")
    for row in dictionary:
        print(row['Number'])


class GetData:

    def __init__(self, file):
        self._name = file

    def create_dict(self):
        data = csv.DictReader(open(self._name, 'r'), delimiter=",")
        return data

输出如下:

outer loop
1
2
3
outer loop
outer loop
outer loop
outer loop

我想要的输出是:

outer loop
1
2
3
outer loop
1
2
3
outer loop
1
2
3
outer loop
1
2
3
outer loop
1
2
3

有谁知道为什么会在Python中发生这种情况?

2 个答案:

答案 0 :(得分:0)

由于您正在使用文件对象,因此它正在从光标位置读取。这不是第一次出现问题,因为位置位于文件的开头。之后,它从文件末尾读到文件的末尾。

我不确定GetData是如何工作的,但在这种情况下看看它是否有seek命令:

for i in range(5):
    print('outer loop')
    dictionary.seek(0)
    for row in dictionary:
        print(row['Number'])

正如g.d.d.c在注释中指出的那样,它也可能是生成器而不是文件对象,在这种情况下,这种方法是有缺陷的。生成器只运行一次,因此您可能需要dict()它。这完全取决于GetData.create_dict的工作原理!

根据您GetData.create_dict给出csv.DictReader的评论,您的选项有限。请注意,DictReader基本上只是list的{​​{1}},因此您可以逃脱:

dicts

然后你可以遍历list_of_dicts = [row for row in dictionary]

list_of_dicts

答案 1 :(得分:0)

csv.DictReader是关联的打开文件的迭代器。在文件上循环一遍后,你就到了最后(EOF)。

要再次循环,只需查找文件的开头:your_filehandle.seek(0)