【问题标题】:Get only new lines from file仅从文件中获取新行
【发布时间】:2014-09-09 04:58:06
【问题描述】:

目前我有这段代码,但它读取所有行,然后用 while True 语句观察文件:

with open('/var/log/logfile.log') as f:
        while True:
            line = f.readline()
            if not line:
                time.sleep(1)
            else:
                print(line)

我实际上只需要在打开文件时已经检测到的行之后出现新的行 - 任何人都可以帮助我吗?也许比使用 while 语句更好的观看方式?

另一个问题是,在 Linux 机器上,脚本实际上锁定了文件,因此在我再次关闭脚本之前无法将其写入。在 OS X 上它工作正常。想出一个解决这个问题的想法也不错。

希望有人从事过类似的工作。

【问题讨论】:

    标签: python python-2.7 logging python-3.x


    【解决方案1】:

    您最初可以完全读取文件,然后将其关闭,并在其上保留更改监视器,此监视器在下面使用轮询实现。

    import time
    
    filePath = '/var/log/logfile.log'
    
    lastLine = None
    with open(filePath,'r') as f:
            while True:
                line = f.readline()
                if not line:
                    break
                print(line)
                lastLine = line
    
    while True:
        with open(filePath,'r') as f:
            lines = f.readlines()
        if lines[-1] != lastLine:
            lastLine = lines[-1]
            print(lines[-1])
        time.sleep(1)
    

    但您也可以使用如下所述的工具:Detect File Change Without Polling

    【讨论】:

    • 这个很棒,但仍然在 Linux 中锁定文件 - 知道为什么吗?
    • @Adionditsak 尝试在第二个循环中删除 with 句子,只需:f = open(...) 或从 with 块中删除来自 if lines[-1]... 的行
    【解决方案2】:
    with open('/var/log/logfile.log','r') as f:
        for line in f:
            print line
    

    【讨论】:

    • 你的最后一行f.close() 是不必要的,因为f 将在with 块的末尾关闭。
    • @PabloFranciscoPérezHidalgo 我们需要明确关闭文件 f 否则会根据应用程序的性质和范围发生问题。我给你一个简单而简短的例子:尝试使用多行附加数据(使用a 打开文件并写入:yourfile.write("line 1") ... line 2 ... line 3. Don注意类型yourfile.close()。用cat yourfile.txt(例如)检查你的文件,看看你的行是否被插入。
    • 据我了解,with 中打开的资源将在其块的末尾关闭。像这样的答案:stackoverflow.com/questions/1369526/… 似乎强化了这个想法。我已经执行了你建议的测试,我得到了预期的结果,所有的行都插入了。你能发布一个你描述的情况发生的例子吗?
    • @PabloFranciscoPérezHidalgo 我按照link 接受了您向我展示的问题的答案。官方文档说的是你告诉我的。我回到我几天前做的一个小脚本:我猜我的问题与关闭文件无关。对于提供错误信息,我深表歉意。我更新了我的答案。非常感谢您纠正我。
    【解决方案3】:

    试试这个,

    readfile = open('/var/log/logfile.log','r')
    if readfile:
       for lines in readfile:
          print lines
    readfile.close()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-05
      • 1970-01-01
      • 2020-12-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多