Python 多次循环字典

1 投票
2 回答
2618 浏览
提问于 2025-04-18 03:09

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

我使用了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

csv.DictReader 是一个用于处理打开文件的工具。它会逐行读取文件内容。当你读完一遍文件后,就到达了文件的末尾。

如果你想再读一遍文件,只需要把读取的位置移回文件的开头:your_filehandle.seek(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 本质上就是一个 dictlist,所以你可能可以这样做:

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'])

撰写回答