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