我有一个大量项目的生成器。我想遍历它们一次,将它们输出到文件中。然而,根据我当前拥有的文件格式,我首先必须输出我所拥有的项目数。我不想在内存中构建项目列表,因为它们太多了,这需要很长时间和大量内存。是否有一种方法可以遍历生成器并获取其长度,但又能够稍后再次遍历它以获取相同的项目?
如果没有,我还能想出什么其他解决方案来解决这个问题?
如果没有,我还能想出什么其他解决方案来解决这个问题?
这是不可能的。一旦生成器耗尽,就需要重建才能再次使用。如果事先知道项目数量,则可以在迭代器对象上定义__len__()
方法,然后可以针对迭代器对象调用len()
。
我认为任何通用的迭代器都不可能做到这一点。你需要找出生成器最初是如何构建的,然后重新生成它以进行最终的传递。
或者,您可以向文件写入一个虚拟大小,写入项目,然后重新打开文件进行修改并在标头中更正大小。
如果您的文件是二进制格式,则这可能非常有效,因为无论实际大小如何,大小所需的字节数相同。如果是文本格式,则可能需要向文件添加一些额外长度,如果您不能填充虚拟大小以涵盖所有情况。有关使用Python在文本文件中插入和重写的讨论,请参见此问题。