【问题标题】:Open text file, print new lines only in python打开文本文件,仅在 python 中打印新行
【发布时间】:2014-03-05 15:13:36
【问题描述】:

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

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

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

干杯。

【问题讨论】:

标签: python readlines os.path


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    也许你可以:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多