【问题标题】:Wait for text file to be written, read changes line by line and print等待写入文本文件,逐行读取更改并打印
【发布时间】:2014-02-12 16:35:50
【问题描述】:

我有下面的代码,它等待日志文件出现,它被外部程序保存在那里,当日志文件出现时,我打开它,同时它仍在被写入,并打印内容,作为日志文件正在由外部程序更新我想打印出任何写入它的新行。目前我清除打印出来并重新打印整个文本,我想避免这种情况,我只想打印新行。另一个需要改进的是等待文件出现,而不是仅仅暂停 python 脚本。

    a=0
    while a <= 10:
        if os.path.isfile(logPath):
            infile = file(logPath)
            break
        a=a+1
        time.sleep(1)
    fileSize1 = 0
    while True:
        wx.Yield()
        fileSize = os.path.getsize(logPath)
        if fileSize > fileSize1:
            lines = infile.readlines()
            log.Clear()
            log.Refresh()
            for line in lines:
                print line.rstrip()
            if "DBG-X: Returning 1" in line:
                break
            if "DBG-X: Returning 0" in line:
                break
        fileSize1 = fileSize
        infile.seek(0)

【问题讨论】:

  • 保留一个LastLinePrinted 变量并检查文件中的行数是否更大?
  • 听起来不错,如何检查行数是否更大?
  • 看看这个答案...stackoverflow.com/a/850962/156755。它描述了计算文件中行数的不同方式。
  • 那么我如何只打印出新行呢?
  • @speedyrazor print lines[latestLineIndex:]

标签: python file readlines


【解决方案1】:

试试这样的...

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

        if "DBG-X: Returning 1" in line:
            break
        if "DBG-X: Returning 0" in line:
            break
    fileSize1 = fileSize
    infile.seek(0)

关键位是

for line in lines[lastLineIndex:]:

我们跳过我们已经看到的行。您可能可以跳过 newLines 变量而直接使用 lastLineIndex += 1,但我不喜欢在 for 循环中更改 lastLineIndex(这是我为了避免其他语言出现问题而养成的习惯)

【讨论】:

  • 干杯基本。那就是问题1解决了。关于等待文件出现而不是仅仅暂停 python 脚本的任何想法?
  • 试试这个答案...stackoverflow.com/a/597962/156755您可以监控文件系统事件(如创建的文件)并检查文件名...
  • 这一切都很好。当运行 CPU 被最大化时,当进程运行大约 45 分钟时,有没有办法在每个循环中转储/刷新内存 CPU,因为我可能会在之后立即运行另一个,所以在中间刷新可能是一个好主意。 ,但是我该怎么做呢?
  • @speedyrazor 请提出一个新问题 - 它会在未来帮助其他人并避免不相关的混乱。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多