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

最有效的方法;蚕食;文本文档中的第一行文本,然后在python中重新保存,python,text-files,deque,Python,Text Files,Deque,我有一个文本文档,我想每隔30秒左右重复删除第一行文本 我已经为python resetable timer对象编写了(或者更准确地复制了)代码,该对象允许在不要求重置或取消的情况下每隔30秒以非阻塞方式调用一个函数 (如果有人能检查一下我在中实现repeat的方式,那还可以,因为我的python在运行时有时会崩溃,我们将不胜感激:) 现在,我想编写一个函数来加载一个文本文件,可能会复制除第一行以外的所有内容,然后将其重写为同一个文本文件。我可以这样做,我想这样。。。但这是最有效的吗 def

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

我已经为python resetable timer对象编写了(或者更准确地复制了)代码,该对象允许在不要求重置或取消的情况下每隔30秒以非阻塞方式调用一个函数

(如果有人能检查一下我在中实现repeat的方式,那还可以,因为我的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)  
这是可行的,但这是最好的方法吗?

我会使用with
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
异常

这使得重写大文件更加高效,因为您只需要将
fileinput
readlines缓冲区保留在内存中

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

但这需要您读取内存中的所有文件;不要对大文件执行此操作。

+1对于
文件输入
,您可能需要对如何将标准输出重定向到文件进行注释