0

我有一个文本文件,每 10 秒由另一个程序写入一次。我的代码通过这个文件并解析我想要的数据。但在某些时候 for 循环到达文件末尾并且程序关闭。

目标:我希望程序在 for 循环内等待更多数据到来,以便它也解析新数据。

我用一段时间尝试了它,条件是留下要读取的行,但由于某种原因,程序在退出 while 循环后只是停止了一点。如果我添加让我们说 25 行......它会处理其中的 9 个和然后程序退出for循环并且程序完成(不崩溃)

问题:有没有更好的方法让程序空闲直到新数据到达?这段代码有什么问题?

k = -1
with open('epideiksh.txt') as weather_file:
    for line in weather_file:
            k = k+1
            lines_left = count_lines_of('epideiksh.txt') - k
            while ( lines_left <= 10 ):
                print("waiting for more data")
                time.sleep(10)
                pointer = count_lines('epideiksh.txt') - k              
            if line.startswith('Heat Index'):
                do_my_thing()  
        time.sleep(10)
4

1 回答 1

0

最简单但容易出错的模拟方法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)

在我非常有限的测试中,这似乎在没有搜索的情况下工作。但它不应该,因为通常你必须做类似的事情才能清除 eof 标志。需要记住的一件事是,在迭代(文本)文件时,不能对(文本)文件使用 tell(),并且从 SEEK_CUR 中查找会调用 tell()。所以在上面的代码片段中,你不能break跳出for循环并陷入input.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)
于 2013-07-07T06:18:08.287 回答