0

我正在打开一个文本文件,该文件一旦创建就会不断被写入,然后将任何新行打印到控制台,因为我不想每次都重新打印整个文本文件。我正在检查文件是否变大,如果是,只需打印下一个新行。这主要是有效的,但偶尔它会对下一个新行有点困惑,新行出现在几行上,与旧行混在一起。有没有更好的方法来做到这一点,下面是我当前的代码。

infile = "Null"
while not os.path.exists(self.logPath):
    time.sleep(.1)

if os.path.isfile(self.logPath):
    infile = codecs.open(self.logPath, encoding='utf8')
else:
    raise ValueError("%s isn't a file!" % file_path)

lastSize = 0
lastLineIndex = 0
while True:
    wx.Yield()
    fileSize = os.path.getsize(self.logPath)
    if fileSize > lastSize:
        lines = infile.readlines()
        newLines = 0
        for line in lines[lastLineIndex:]:
            newLines += 1
            self.running_log.WriteText(line)

        lastLineIndex += newLines

        if "DBG-X: Returning 1" in line:
            self.subject = "FAILED! - "
            self.sendEmail(self)
            break
        if "DBG-X: Returning 0" in line:
            self.subject = "PASSED! - "
            self.sendEmail(self)
            break
    fileSize1 = fileSize
    infile.flush()
    infile.seek(0)

infile.close()

此外,我的应用程序在等待创建文本文件时冻结,因为它需要几秒钟才能出现,这不是很好。

干杯。

4

2 回答 2

0

这个解决方案可能会有所帮助。您还必须等待文件出现,使用os.path.isfileand time.sleep

于 2014-03-05T15:23:21.340 回答
0

也许你可以:

  • 每次需要读取文件时打开文件,
  • 用作直接指向您上次阅读时停止的位置lastSize的参数。seek

附加评论:我不知道你是否需要一些保护,但我认为你不应该费心去测试给定的文件名是否是一个文件;只需在一个try...except块中打开它并发现任何问题。

至于冻结您的应用程序,您可能希望使用某种线程,例如:一个线程,您的主线程,正在处理 GUI,而第二个线程将等待文件被创建。创建文件后,第二个线程将信号发送到 GUI 线程,其中包含要显示的数据。

于 2014-03-05T15:21:35.970 回答