打开文本文件,仅在python中打印新行

时间:2014-03-05 15:13:37

标签: python readlines os.path

我正在打开一个文本文件,一旦创建就会不断被写入,然后将其打印到控制台的任何新行,因为我不想每次都重新打印整个文本文件。我正在检查文件是否增大,如果是,只需打印下一个新行。这大部分都在工作,但偶尔会对下一个新线路感到有些困惑,新线路会出现几行,与旧线路混合在一起。 有没有更好的方法,下面是我目前的代码。

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()

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

干杯。

2 个答案:

答案 0 :(得分:0)

也许你可以:

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

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

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

答案 1 :(得分:0)

This解决方案可以提供帮助。您还必须等待文件显示,使用os.path.isfiletime.sleep