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