为了账号安全,请及时绑定邮箱和手机立即绑定

可以在Python中重置迭代器吗?

/ 猿问

可以在Python中重置迭代器吗?

噜噜哒 2019-12-26 10:04:29

我可以在Python中重置迭代器/生成器吗?我正在使用DictReader,并希望将其重置(从csv模块)到文件的开头。



查看完整描述

3 回答

?
慕容4345310

我看到许多建议itertools.tee的答案,但这忽略了文档中的一项重要警告:


此itertool可能需要大量辅助存储(取决于需要存储多少临时数据)。一般来说,如果一个迭代器使用大部分或全部的数据的另一个前开始迭代器,它是更快地使用list()代替tee()。


基本上,tee是针对以下情况设计的:一个迭代器的两个(或多个)克隆虽然彼此“不同步”,但这样做却不太多 -而是说它们在同一“邻近度”(彼此落后或领先的物品很少)。不适合OP的“从头开始重做”问题。


L = list(DictReader(...))另一方面,只要字典列表可以舒适地放入内存中,就非常适合。可以随时使用制作新的“从头开始的迭代器”(非常轻巧且开销低)iter(L),并且可以部分或全部使用它,而不会影响新的或现有的迭代器;其他访问模式也很容易获得。


正如正确回答的几个答案所述,在特定情况下,csv您还可以.seek(0)使用基础文件对象(一种特殊情况)。我不确定它是否已记录在案并得到保证,尽管目前可以使用。仅对真正巨大的csv文件可能值得考虑,list我建议在其中使用通用方法,因为一般方法会占用太大的内存。


查看完整回答
反对 2019-12-26
?
犯罪嫌疑人X

如果您有一个名为“ blah.csv”的csv文件,


a,b,c,d

1,2,3,4

2,3,4,5

3,4,5,6

您知道可以打开文件进行读取,并使用以下命令创建DictReader


blah = open('blah.csv', 'r')

reader= csv.DictReader(blah)

然后,您将可以得到带有的下一行reader.next(),该行应输出


{'a':1,'b':2,'c':3,'d':4}

再次使用它会产生


{'a':2,'b':3,'c':4,'d':5}

但是,在这一点上,如果您使用blah.seek(0),则下次致电reader.next()您会得到


{'a':1,'b':2,'c':3,'d':4}

再次。


这似乎是您要寻找的功能。我敢肯定,与此方法相关的一些技巧我还不知道。@Brian建议简单地创建另一个DictReader。如果您是第一个阅读器,则此操作将无法进行,因为无论您在文件中的任何位置,新阅读器都将具有意外的键和值。


查看完整回答
反对 2019-12-26
?
慕尼黑的夜晚无繁华

不会。Python的迭代器协议非常简单,并且仅提供一种方法(.next()或__next__()),并且通常不提供重置迭代器的方法。


常见的模式是改为使用相同的过程再次创建新的迭代器。


如果要“保存”迭代器以便回到其开始,也可以使用 itertools.tee


查看完整回答
反对 2019-12-26

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信