Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中从文件中读取行后删除该行_Python_File - Fatal编程技术网

在Python中从文件中读取行后删除该行

在Python中从文件中读取行后删除该行,python,file,Python,File,我有一个从文件中读取行并处理它们的函数。但是,我想删除我读过的每一行,但不使用readlines()一次读取所有行并将它们存储到列表中 如果问题是内存不足,那么我建议您使用for line in file语法,因为这样一次只能加载一行: bigFile = open('path/to/file.dat','r') for line in bigFile: processLine(line) 如果您可以构造系统,使其能够逐行处理文件,那么在尝试读取整个文件时不会耗尽内存。当程序移到下一行

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

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

bigFile = open('path/to/file.dat','r')
for line in bigFile:
    processLine(line)
如果您可以构造系统,使其能够逐行处理文件,那么在尝试读取整个文件时不会耗尽内存。当程序移到下一行时,它将放弃它对文件内容所做的复制

readlines
不起作用时,为什么会起作用? 在Python中有,它提供了一个接口,一次提供一个集合的一项,如果反复调用
,它将迭代整个集合。因为您很少一次需要整个集合,所以这可以允许程序处理内存中的单个项,从而允许处理大型文件

相反,
readlines
函数必须返回整个列表,而不是迭代器对象,因此它不能像迭代器那样延迟后续行的处理。自Python 2.3以来,旧的
xreadlines
read迭代器被弃用,转而使用
for line in file
,因为
open
返回的文件对象已更改为返回迭代器而不是列表

这遵循了名为的函数范式,即除非需要结果,否则避免进行任何实际处理

更多迭代器
迭代器可以链接在一起(先处理这个文件的行,然后处理那个文件的行),或者使用优秀的模块(包含在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个条目),或者甚至是另一个索引文件,每次添加文档时都将其起始位置放在索引上。一旦你知道了文档的位置,只需使用函数到达那里并开始阅读即可


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

这很难遵循,您能简化它吗?还有,你所说的“文档”、“文档相似性”、“点”是什么意思。。。理想情况下,提供一些小的示例片段,说明您拥有哪些数据,以及到目前为止您正在使用哪些代码。我只想删除我读过的每一行,但不使用readlines,这样我可以一次获得文件的所有行。每次我的函数打开文件时,我都想删除我读过的每一行。在文件中删除还是不再将它们存储在内存中?在文件中删除它们。谢谢你的回答。我是否必须为函数processLine导入库,因为我获取了名称错误:未定义全局名称“processLine”。processLine是我的代码段的占位符-将其替换为要用于处理行的代码,或者编写一个函数来处理一行,名为
processLine
@PhilH显然,OP希望在处理完这些行后立即将它们从文件中删除。不过我不确定这是否是个好主意:)。@Maxime:是的,我猜请求它是为了解决最初的问题,即文件太大,因此与其尝试删除,不如建议先进行迭代。