Python 如何使文件处理程序闲置,直到新数据到达文件中
我有一个文本文件,每10秒由另一个程序编写一次。 我的代码遍历这个文件并解析我想要的数据。但在某个时刻,for循环到达文件的末尾,程序关闭 目标:我希望程序在for循环中等待更多的数据,以便它也解析新数据 我试着使用while,但由于某些原因,程序在退出while循环后会停止一点。如果我添加25行,它会处理其中的9行,然后程序退出for循环,程序完成(而不是崩溃) 问题:是否有更好的方法使程序闲置,直到新数据到达?这个代码有什么问题Python 如何使文件处理程序闲置,直到新数据到达文件中,python,parsing,eof,Python,Parsing,Eof,我有一个文本文件,每10秒由另一个程序编写一次。 我的代码遍历这个文件并解析我想要的数据。但在某个时刻,for循环到达文件的末尾,程序关闭 目标:我希望程序在for循环中等待更多的数据,以便它也解析新数据 我试着使用while,但由于某些原因,程序在退出while循环后会停止一点。如果我添加25行,它会处理其中的9行,然后程序退出for循环,程序完成(而不是崩溃) 问题:是否有更好的方法使程序闲置,直到新数据到达?这个代码有什么问题 k=-1 打开('epideiksh.txt')作为天气_文件
k=-1
打开('epideiksh.txt')作为天气_文件:
对于weather_文件中的行:
k=k+1
lines_left=计数('epideiksh.txt')-k的行数
而(左行模拟tail
的最简单但容易出错的方法是:
with open("filename") as input:
while True:
for line in input:
if interesting(line):
do_something_with(line)
sleep a_little
input.seek(0, io.SEEK_CUR)
在我非常有限的测试中,这在没有seek的情况下似乎是可行的。但它不应该这样做,因为通常你必须这样做才能清除eof标志。需要记住的一点是,tell()不能在(文本)文件上使用,而从seek_CUR进行搜索会调用tell()。因此,在上面的代码段中,您不能将从for
循环中分离出来,并落入输入.seek()
调用中
上面的问题是,readline
(迭代器中隐含的)可能只读取当前正在写入的行的一部分。因此,您需要准备放弃并重新读取部分行:
with open("filename") as input:
# where is the end of the last complete line read
where = input.tell()
# use readline explicitly because next() and tell() are incompatible
while True:
line = input.readline()
if not line or line[-1] != '\n':
time.sleep(a_little)
input.seek(where)
else:
where = input.tell()
if interesting(line):
do_something_with(line)
count\u lines\u of
是如何工作的?还有10行,为什么还要睡觉?是不是早期版本的延迟,还是什么?当你说“退出while循环后停止一点”,你指的是哪个while循环?如果它是外部的,为什么它不应该停止?指针是错误地留下的。它是我忘记重命名的左行。它是左行=计数行('epideiksh.txt')-k。只有一个while循环。外部的out是for循环。计数行是我编写的一个计算文件总行数的函数。10是任意的。我只是在文件末尾附近选取了一个小数字,所以每次读一行时,你都在读整个文件(可能更频繁)。这似乎有点低效:)我不知道你的代码为什么会表现出这种行为;我怀疑这是因为文件迭代器缓冲了输入,所以在for循环中遇到了EOF,尽管您还没有到达那个点。但这只是一个猜测。我提供了一个关于如何跟踪的答案。