【发布时间】:2013-10-02 17:25:53
【问题描述】:
我写了一个读取 txt 文件的类。该文件由非空行块(我们称它们为“节”)组成,以空行分隔:
line1.1
line1.2
line1.3
line2.1
line2.2
我的第一个实现是读取整个文件并返回一个列表列表,即节列表,其中每个节都是行列表。 这在记忆方面显然很糟糕。
所以我将它重新实现为列表生成器,也就是说,在每个循环中,我的班级都会将内存中的整个部分作为列表读取并生成它。
这样比较好,但在大截面的情况下仍然存在问题。所以我想知道我是否可以将它重新实现为生成器的生成器?问题是这个类非常通用,它应该能够满足这两个用例:
- 读取一个非常大的文件,其中包含非常大的部分,并且只循环浏览一次。生成器的生成器非常适合此操作。
-
将一个小文件读入内存以循环多次。列表生成器工作正常,因为用户可以调用
列表(MyClass(file_handle))
但是,生成器的生成器在情况 2 中不起作用,因为内部对象不会转换为列表。
有什么比实现显式 to_list() 方法更优雅的方法,它将生成器的生成器转换为列表列表?
【问题讨论】:
-
您是否尝试过使用 readline。这样只读取一行行;由新行分隔。这是在内存中加载小数据的好方法,除非您的行本身很大。
-
@Vivek 我的行非常复杂,我从每行生成一个对象来验证行,其状态也取决于前面的行。向用户公开文件的内部格式不是一种选择。
-
你能不能给一个示例输入行...
-
问题到底是什么?假设你有生成器,如何编写生成器的生成器,或者如何为小文件创建列表列表?对于后一种情况:
[list(section()) for section in MyClass(file_handle)]呢? -
@tobias_k 问题是如何从生成器的生成器创建列表列表,以一种对用户来说相当透明和优雅的方式。您的示例是我将如何实现我提到的显式 to_list() 方法,但我想知道是否有任何不需要用户调用显式 to_list() 方法的东西?换句话说,我想避免一旦分心的用户执行 list(MyClass(file_handle)),库就会神秘地崩溃。
标签: python list generator yield