-2

我有一个从文件中读取行并处理它们的函数。但是,我想删除我读过的每一行,但不使用 readlines() 一次读取所有行并将它们存储到列表中。

4

2 回答 2

3

如果问题是您的内存不足,那么我建议您使用for line in file语法,因为这一次只会加载一行:

bigFile = open('path/to/file.dat','r')
for line in bigFile:
    processLine(line)

如果您可以构建系统以便它可以逐行处理文件,那么它不会在尝试读取整个文件时耗尽内存。当程序移动到下一行时,程序将丢弃它对文件内容所做的副本。

为什么这行不通readlines

在 Python 中有迭代器.next(),它提供一个接口来一次提供一个集合的一项,如果被重复调用,则迭代整个集合。因为您很少一次需要整个集合,所以这可以让程序改为使用内存中的单个项目,从而允许处理大文件。

相比之下,该readlines函数必须返回一个完整的列表,而不是一个迭代器对象,因此它不能像迭代器那样延迟后面几行的处理。从 Python 2.3 开始,旧的xreadlinesread 迭代器被弃用,取而代之的是 using for line in file,因为由返回的文件对象open已更改为返回迭代器而不是列表。

这遵循称为“惰性评估”的功能范式,除非需要结果,否则您将避免进行任何实际处理。

更多迭代器

迭代器可以链接在一起(处理这个文件的行,然后处理那个),或者使用优秀的itertools模块(包含在 Python 中)以其他方式组合。这些功能非常强大,可以让您将组合文件或输入的方式与处理它们的代码区分开来。

于 2013-07-12T11:32:25.813 回答
2

首先,删除文件的第一行是一个代价高昂的过程。实际上,如果不重写大部分文件,您不太可能做到这一点。

您有多种方法可以解决您的问题:

1.在python中,文件对象有一个迭代器,也许你可以用它来解决你的内存问题

document_count = 0
with open(filename) as handler:
    for index, line in enumerate(handler):
        if line == '.':
            document_count += 1

2.使用索引。将文件的特定部分保留到索引(固定大小,确保保留足够的空间,假设文件的前 100Ko 应该为索引保留,即大约 100K 条目)甚至另一个索引文件,每次你添加一个文档,将它的起始位置放在索引上。知道文档位置后,只需使用seek功能即可到达并开始阅读

3.读取文件一次并存储每个文档位置,这与之前的想法非常相似,除了它在内存中性能更好,但每次运行应用程序时都必须重复该过程(无持久性)

于 2013-07-12T11:34:17.557 回答