如何使用python有效地跳过文件中的前n行?

时间:2016-04-13 08:30:46

标签: python

我目前正在使用带有Python包装器的C ++脚本来逐行操作更大的(15 GB)文本文件。它的有效作用是从input.txt读取一行,处理它,将结果输出到output.txt。我在这里使用straigtforward循环(inp作为input.txt打开,out作为output.txt打开):

for line in inp:
    result = operate(line)
    out.write(result)

但是,由于C ++脚本的问题,它有一些失败率,导致循环在大约一千万次迭代后关闭。这使我得到的输出文件只使用了10%的输入。

由于我无法修复原始脚本,所以我只想重新启动它停止的地方。我计算了output.txt的行,创建了另一个名为output2.txt的行,并启动了以下代码:

k = 0
for line in inp:
    if k < 12123253:
        k + = 1
    else:
        result = operate(line)
        out2.write(result)
        k + = 1

然而,与我计算在一分钟内结束的线路相比,这种方法需要很长时间才能到达指定的线路。

为什么这种方法效率低下?有更快的吗?我在Windows PC上具有强大的计算能力(72GB RAM,良好的处理器),并使用python 2.7。

2 个答案:

答案 0 :(得分:5)

我建议您使用itertools

with open(inp) as f:
    result = itertools.islice(f, start_line, None)
    for i in result:
        #do something with this line

答案 1 :(得分:1)

您可以使用file.seekfile.tell。下面是示例(伪)代码:

def seralizebreakpoint(pos):
    pass

def desearializebreakpoint():
    '''return -1 if there is actually no break point'''
    pass

def process(inp):

    pos = inp.tell()
    for line in inp:
        try:
            result = operate(line)
            pos = inp.tell()            
        except:
            seralizebreakpoint(pos)
            raise

def processEntry(pathtoinput):

    bp = desearializebreakpoint() 
    with open(pathtoinput, 'r') as inp:
        if bp > -1:
            inp.seek(bp)
        process(inp)