python - 从经常更新的文件中读取

标签 python file-io generator fopen

我目前正在 Linux 系统上用 python 编写程序。目标是读取日志文件并在找到特定字符串时执行 bash 命令。日志文件不断被另一个程序写入。

我的问题:如果我使用 open() 方法打开文件,我的 Python 文件对象会随着其他程序写入实际文件或我是否必须定期重新打开文件?

更新:感谢到目前为止的回答。我也许应该提到该文件是由 Java EE 应用程序写入的,因此我无法控制何时将数据写入其中。我目前有一个程序,它每 10 秒重新打开一次文件,并尝试从文件中最后一次读取的字节位置读取。目前它只是打印出返回的字符串。我希望文件不需要重新打开,但读取命令会以某种方式访问​​ Java 应用写入文件的数据。

#!/usr/bin/python
import time

fileBytePos = 0
while True:
    inFile = open('./server.log','r')
    inFile.seek(fileBytePos)
    data = inFile.read()
    print data
    fileBytePos = inFile.tell()
    print fileBytePos
    inFile.close()
    time.sleep(10)

感谢有关 pyinotify 和生成器的提示。我将看看这些以获得更好的解决方案。

最佳答案

我建议您查看 David Beazley 的 Generator Tricks for Python ,尤其是第 5 部分:处理无限数据。它将实时处理 Python 等效的 tail -f logfile 命令。

# follow.py
#
# Follow a file like tail -f.

import time
def follow(thefile):
    thefile.seek(0,2)
    while True:
        line = thefile.readline()
        if not line:
            time.sleep(0.1)
            continue
        yield line

if __name__ == '__main__':
    logfile = open("run/foo/access-log","r")
    loglines = follow(logfile)
    for line in loglines:
        print line,

关于python - 从经常更新的文件中读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5419888/

相关文章:

python - 在 Python 中解析复杂且不断变化的 JSON 数据,深度多个级别

python - Django:没有 CSS 和正确文本的 html

python - 为什么嵌套的空生成器会提前退出而不会引发错误?

java - 将JTable内容保存到文本文件并读取

javascript - 我如何等待 yield ?

python - 如何确定 Python 生成器中的值是否为最后一个?

python - 步入 python-bitstring 2.2.0

java - 我想知道 System.err 是如何工作的

php - fatal error : Call to a member function prepare() on a non-object

python - 检查生成器是否真的在一行中生成了一些东西