我有一个函数可以读取文件中的行并处理它们。但是,我想删除我读过的每一行,但不使用readlines()一次读取所有行并将它们存储到列表中。
答案 0 :(得分:2)
如果问题是你的内存不足,那么我建议你使用for line in file
语法,因为这样只会一次加载一行:
bigFile = open('path/to/file.dat','r')
for line in bigFile:
processLine(line)
如果您可以构建系统以便它可以逐行处理文件,那么尝试读取整个文件时内存不会耗尽。当程序移动到下一行时,程序将丢弃它对文件内容的复制。
readlines
不起作用?在Python中有iterators,它提供了一次提供集合中一个项目的接口,如果重复调用.next()
,则迭代整个集合。因为您很少需要同时使用整个集合,所以这可以允许程序在内存中使用单个项目,从而允许处理大型文件。
相比之下,readlines
函数必须返回一个完整的列表,而不是迭代器对象,所以它不能像迭代器那样延迟后续行的处理。从Python 2.3开始,旧的xreadlines
读取迭代器不推荐使用for line in file
,因为open
返回的文件对象已更改为返回迭代器而不是列表。
这遵循称为'lazy evaluation'的功能范例,除非并且直到需要结果,否则您将避免进行任何实际处理。
可以将迭代器链接在一起(处理此文件的行,然后处理该行),或者使用优秀的itertools模块(包含在Python中)进行组合。它们非常强大,可以让您分离出处理它们的代码中的文件或输入的组合方式。
答案 1 :(得分: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.读取文件一次并存储每个文档位置,这与之前的想法非常相似,除了它在内存中性能更好但是每次运行应用程序时都必须重复该过程(否)持久性)