Python 多次循环字典
我的问题来自一个更大的程序,但为了这个问题,我把具体问题缩小并简化了很多。
我使用了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
本质上就是一个 dict
的 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'])