1

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

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

python中的可重置计时器重复直到取消

(如果有人可以检查我实现重复的方式没问题,因为我的 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)  

这行得通,但这是最好的方法吗?

4

1 回答 1

3

我会使用该fileinput模块inplace=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空文件的异常。

这使得重写文件更有效,因为您只需将fileinputreadlines 缓冲区保留在内存中。

我认为根本不需要 a 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)  

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

于 2013-03-27T11:15:35.137 回答