Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 连续读取一个文件并将输出发送到另一个文件_Python_File_Line - Fatal编程技术网

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

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

我有一个不断更新的文件'out.txt'。我需要每隔N分钟定期将此文件的内容发送到另一个文件“received.txt”。我不想发送前面的行。因此,脚本需要发送新数据,并使用新的txt行更新“received.txt”,而不是重复行

我很难把这个脚本组合起来。我猜我需要某种循环来持续地做这件事。这是我到目前为止所拥有的。(不正常)

编辑:我在树莓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
任何建议都会非常有用。
谢谢

有几种方法可以做到这一点

最简单的方法是即使在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的用例,一次编写整个内容(或者,如果文件很大,可能是逐块编写)可能比逐行编写要好。