我有一个从文件中读取行并处理它们的函数。但是,我想删除我读过的每一行,但不使用 readlines() 一次读取所有行并将它们存储到列表中。
2 回答
如果问题是您的内存不足,那么我建议您使用for line in file
语法,因为这一次只会加载一行:
bigFile = open('path/to/file.dat','r')
for line in bigFile:
processLine(line)
如果您可以构建系统以便它可以逐行处理文件,那么它不会在尝试读取整个文件时耗尽内存。当程序移动到下一行时,程序将丢弃它对文件内容所做的副本。
为什么这行不通readlines
?
在 Python 中有迭代器.next()
,它提供一个接口来一次提供一个集合的一项,如果被重复调用,则迭代整个集合。因为您很少一次需要整个集合,所以这可以让程序改为使用内存中的单个项目,从而允许处理大文件。
相比之下,该readlines
函数必须返回一个完整的列表,而不是一个迭代器对象,因此它不能像迭代器那样延迟后面几行的处理。从 Python 2.3 开始,旧的xreadlines
read 迭代器被弃用,取而代之的是 using for line in file
,因为由返回的文件对象open
已更改为返回迭代器而不是列表。
这遵循称为“惰性评估”的功能范式,除非需要结果,否则您将避免进行任何实际处理。
更多迭代器
迭代器可以链接在一起(处理这个文件的行,然后处理那个),或者使用优秀的itertools模块(包含在 Python 中)以其他方式组合。这些功能非常强大,可以让您将组合文件或输入的方式与处理它们的代码区分开来。
首先,删除文件的第一行是一个代价高昂的过程。实际上,如果不重写大部分文件,您不太可能做到这一点。
您有多种方法可以解决您的问题:
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.读取文件一次并存储每个文档位置,这与之前的想法非常相似,除了它在内存中性能更好,但每次运行应用程序时都必须重复该过程(无持久性)