连续读取文件并将输出发送到另一个文件

时间:2014-07-29 23:19:07

标签: python file line

我有一个连续更新的文件'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

任何建议都会非常有帮助。 谢谢

1 个答案:

答案 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}},请不要复制此代码。)