Python 连续读取一个文件并将输出发送到另一个文件
我有一个不断更新的文件'out.txt'。我需要每隔N分钟定期将此文件的内容发送到另一个文件“received.txt”。我不想发送前面的行。因此,脚本需要发送新数据,并使用新的txt行更新“received.txt”,而不是重复行 我很难把这个脚本组合起来。我猜我需要某种循环来持续地做这件事。这是我到目前为止所拥有的。(不正常) 编辑:我在树莓Pi上使用Debian(Raspbian)Python 连续读取一个文件并将输出发送到另一个文件,python,file,line,Python,File,Line,我有一个不断更新的文件'out.txt'。我需要每隔N分钟定期将此文件的内容发送到另一个文件“received.txt”。我不想发送前面的行。因此,脚本需要发送新数据,并使用新的txt行更新“received.txt”,而不是重复行 我很难把这个脚本组合起来。我猜我需要某种循环来持续地做这件事。这是我到目前为止所拥有的。(不正常) 编辑:我在树莓Pi上使用Debian(Raspbian) import sys num_lines = sum(1 for line in open('out.tx
import sys
num_lines = sum(1 for line in open('out.txt')) # read the last line of the updated file
sys.stdout = open('received.txt', 'w') #write to the received.txt file
print 'test'
f = open('out.txt', 'r') #read the data from the last line
f.readline(num_lines)
for line in f:
print line
任何建议都会非常有用。
谢谢有几种方法可以做到这一点 最简单的方法是即使在EOF之后也要在文件上循环。您可以通过在f:中的
行周围环绕而使用,如果为True:
,则只需环绕f.readline()
,即可完成此操作
但这将浪费大量的CPU资源,甚至可能会浪费磁盘访问的时间,以便尽可能快地反复检查文件是否仍处于EOF状态。您可以通过在到达文件末尾时休眠来修复此问题,如下所示:
while True:
for line in f:
print line
time.sleep(0.5)
但是,如果文件长时间不写入,您仍然在浪费CPU电源(这看起来可能不是问题,但是想象一下当计算机想进入睡眠时会发生什么,而它不能,因为您每半秒钟就让它工作一次)。同时,如果文件的写入速度比每秒两次快得多,则会出现延迟
所以,一个更好的解决方案是在有内容可读之前进行阻止
不幸的是,没有简单的跨平台方法可以做到这一点。幸运的是,在大多数平台上都有相对简单的特定于平台的方法,但我需要了解您的平台以提供帮助
例如,在OS X或其他*BSD系统上,您可以使用等待,直到文件具有要读取的内容:
from select import *
# the rest of your code until the reading loop
while True:
for line in f:
print line
kq = kqueue()
kq.control([kevent(f.fileno(), filter=KQ_FILTER_READ, flags=KQ_EV_ADD)], 0, 0)
kq.control(None, 1)
kq.close()
但这在Windows、linux或任何其他平台上都不起作用。(同样,在BSD上这样做是一种非常糟糕的方法,它只是比正确的方法短。如果你想在OS X上这样做,请找到一个关于在Python中使用kqueue
的好教程,不要复制此代码。)小心-你的代码中有卷曲的引号。如果你没有注意到这些问题,可能会让你头疼。你在哪个平台上?不同的平台有不同的选项。对不起,我在树莓Pi上使用Rasbian。@JoranBeasley:你确定你的不起作用吗?我最初没有注意到,他只希望文件每N分钟更新一次,并按照一个非常固定的启动时间表进行更新,因此只要最多N分钟的延迟是可以接受的,这可能是您的睡眠
解决方案就可以了。此外,对于OP的用例,一次编写整个内容(或者,如果文件很大,可能是逐块编写)可能比逐行编写要好。