在Python中从大文件中删除行的最快方法

2024-05-19 12:25:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在Linux系统上处理一个非常大的(~11GB)文本文件。我正在一个程序中运行它,该程序正在检查文件是否有错误。一旦发现错误,我需要要么修复行,要么完全删除行。然后重复。。。

最终,一旦我对这个过程感到满意,我会完全自动化它。但是现在,假设我是手工操作的。

从这个大文件中删除特定行的最快方式(以执行时间计)是什么?我想用Python来做……但也可以用其他的例子。行可能在文件中的任何位置。

如果是Python,则假定以下接口:

def removeLine(filename, lineno):

谢谢

-aj公司


Tags: 文件程序过程linux系统def错误方式
3条回答

据我所知,你不能用python打开一个txt文件并删除一行。你必须做一个新文件,把除了那一行以外的所有东西都移到上面。如果你知道具体的行,那么你可以这样做:

f = open('in.txt')
fo = open('out.txt','w')

ind = 1
for line in f:
    if ind != linenumtoremove:
        fo.write(line)
    ind += 1

f.close()
fo.close()

当然,您可以检查行的内容,以确定是否要保留它。我还建议,如果您有一个完整的行列表需要删除/更改,以便在一次传递文件中完成所有这些更改。

在适当的位置修改文件,违规行将替换为空格,这样文件的其余部分就不需要在磁盘上乱放。如果修复程序不长于要替换的行,也可以将该行“修复”

import os
from mmap import mmap
def removeLine(filename, lineno):
    f=os.open(filename, os.O_RDWR)
    m=mmap(f,0)
    p=0
    for i in range(lineno-1):
        p=m.find('\n',p)+1
    q=m.find('\n',p)
    m[p:q] = ' '*(q-p)
    os.close(f)

如果可以更改另一个程序以输出文件偏移量而不是行号,则可以直接将偏移量分配给p,而不必使用for循环

同一文件可以同时有两个文件对象(一个用于读取,一个用于写入):

def removeLine(filename, lineno):
    fro = open(filename, "rb")

    current_line = 0
    while current_line < lineno:
        fro.readline()
        current_line += 1

    seekpoint = fro.tell()
    frw = open(filename, "r+b")
    frw.seek(seekpoint, 0)

    # read the line we want to discard
    fro.readline()

    # now move the rest of the lines in the file 
    # one line back 
    chars = fro.readline()
    while chars:
        frw.writelines(chars)
        chars = fro.readline()

    fro.close()
    frw.truncate()
    frw.close()

相关问题 更多 >