我有一个连续更新的文件'out.txt'。我需要每隔N分钟定期将此文件的内容发送到另一个文件'received.txt'。我不希望发送前面的行。因此脚本需要发送新数据并使用新行的txt更新'received.txt',但不能重复行。
我很难将这个脚本放在一起。我猜我需要某种循环来持续这样做。这是我到目前为止所拥有的。 (不按顺序)
编辑:我在Raspberry Pi上使用Debian(Raspbian)
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
任何建议都会非常有帮助。 谢谢
答案 0 :(得分:1)
有几种方法可以做到这一点。
最简单的是即使在EOF之后仍然保持循环文件。你可以通过在while True:
周围包裹for line in f:
,或者只是在f.readline()
周围循环来实现这一目的。
但这会浪费大量的CPU能力,甚至可能会尽可能快地反复检查磁盘访问,无论文件是否仍处于EOF状态。你可以通过在文件结束时休眠来解决这个问题,如下所示:
while True:
for line in f:
print line
time.sleep(0.5)
但是如果文件没有被写入很长时间,你仍然在浪费CPU能力(这可能看起来不是什么问题,但想象一下当计算机想要睡觉时会发生什么,它可以&因为你每半秒钟才能让它工作,所以#39; t。同时,如果文件的写入速度超过两次/秒,则会导致滞后。
因此,更好的解决方案是阻止,直到有东西要读。
不幸的是,没有简单的跨平台方法可以做到这一点。幸运的是,在大多数平台上都有相对简单的平台特定方法,但我需要知道您的平台需要帮助。
例如,在OS X或其他* BSD系统上,您可以使用kqueue
等待文件有东西要读:
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中{1}},请不要复制此代码。)