我的问题来自一个更大的计划,但为了这个问题,我缩小并大大简化了具体问题。
我使用了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中发生这种情况?
答案 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)