从文本文档“蚕食”第一行文本然后在python中重新保存的最有效方法

时间:2013-03-27 11:09:01

标签: python text-files deque

我有一个文本文档,我希望每隔30秒左右重复删除第一行文本。

我已经编写(或更准确地复制)python resettable计时器对象的代码,如果没有要求重置或取消,它允许以非阻塞方式每30秒调用一次函数。

Resettable timer in python repeats until cancelled

(如果有人可以检查我实现重复的方式,那就好了,因为我的python有时会在运行时崩溃,不胜感激:))

我现在想编写我的函数来加载文本文件,并且可能复制除第一行之外的所有文件,然后将其重写为同一文本文件。我能做到这一点,我认为这样做......但它效率最高吗?

def removeLine():

    with open(path, 'rU') as file:
        lines = deque(file)
        try:
            print lines.popleft()
        except IndexError:
            print "Nothing to pop?"
    with open(path, 'w') as file:
        file.writelines(lines)  

这样可行,但它是最好的方法吗?

1 个答案:

答案 0 :(得分:3)

我将fileinput moduleinplace=True

一起使用
import fileinput

def removeLine():
    inputfile = fileinput.input(path, inplace=True, mode='rU')
    next(inputfile, None)  # skip a line *if present*
    for line in inputfile:
        print line,  # write out again, but without an extra newline
    inputfile.close()

inplace=True会导致sys.stdout重定向到打开的文件,因此我们可以简单地“打印”这些行。

next()调用用于跳过第一行;给它一个默认的None会抑制空文件的StopIteration异常。

这使得重写 large 文件更有效率,因为您只需将fileinput读取线缓冲区保留在内存中。

我认为根本不需要deque,即使是你的解决方案;也可以在那里使用next(),然后使用list()来捕获剩余的行:

def removeLine():
    with open(path, 'rU') as file:
        next(file, None)  # skip a line *if present*
        lines = list(file)
    with open(path, 'w') as file:
        file.writelines(lines)  

但是这需要你读取内存中的所有文件;不要对大文件这样做。