我有一个文本文档,我希望每隔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)
这样可行,但它是最好的方法吗?
答案 0 :(得分:3)
我将fileinput
module与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
异常。
这使得重写 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)
但是这需要你读取内存中的所有文件;不要对大文件这样做。