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

AJ.*_*AJ. 22 python optimization

我正在Linux系统上使用一个非常大的(~11GB)文本文件.我正在通过检查文件错误的程序运行它.一旦发现错误,我需要修复该行或完全删除该行.然后重复......

最后,一旦我对这个过程感到满意,我会完全自动完成它.但是现在,让我们假设我正在手动操作.

从这个大文件中删除特定行的最快(在执行时间方面)方法是什么?我想在Python中做到这一点......但是会对其他例子持开放态度.该行可能位于文件中的任何位置.

如果是Python,请假设以下界面:

def removeLine(filename, lineno):

谢谢,

-AJ

K. *_*ord 13

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

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()
Run Code Online (Sandbox Code Playgroud)

  • 至少在Python3中,'frw.writelines(chars)'行应该是'frw.write(chars)' (2认同)

Joh*_*ooy 7

修改文件到位,违规行替换为空格,因此文件的其余部分不需要在磁盘上进行混洗.如果修复不长于您要替换的行,您还可以" 修复 "该行

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)
Run Code Online (Sandbox Code Playgroud)

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

  • 这里的一个限制是,由于mmap耗尽了4GB的地址空间,因此无法使用32位Python构建.请参阅http://stackoverflow.com/questions/1661986/why-doesnt-pythons-mmap-work-with-large-files (3认同)