【问题标题】:Python looping a dictionary multiple timesPython多次循环字典
【发布时间】:2014-06-02 02:33:24
【问题描述】:

我的问题来自一个更大的程序,但为了这个问题,我缩小并显着简化了具体问题。

我使用 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 中会发生这种情况?

【问题讨论】:

  • 如果您的代码中的print(dictionary) 是生成器,还是实际的字典?可能dict(GetData('test.csv').create_dict()) 如果在迭代过程中使用了前者 - 生成器表达式,而实际字典则不会。
  • print(dictionary) 的输出是 <csv.DictReader object at 0x0000000002223278> 我想这意味着我实际上还没有创建字典

标签: python csv dictionary


【解决方案1】:

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

我不确定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 本质上只是dicts 中的list,因此您也许可以逃脱:

list_of_dicts = [row for row in dictionary]

然后你可以遍历list_of_dicts

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

【讨论】:

    【解决方案2】:

    csv.DictReader 是关联打开文件的迭代器。在对文件进行一次循环之后,您就到了结尾(EOF)。

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

    【讨论】:

      猜你喜欢
      • 2020-11-10
      • 1970-01-01
      • 1970-01-01
      • 2018-02-22
      • 2014-02-14
      • 2018-12-04
      • 2017-12-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多