【问题标题】:Efficiently getting a last line of file in Python在 Python 中有效地获取文件的最后一行
【发布时间】:2020-05-31 00:07:35
【问题描述】:

我正在尝试为视频游戏制作插件,该程序所接受的所有输入均来自服务器提供的日志文件。 (插件在windows中运行)

有时,服务器附加日志文件的速度太快,我的脚本无法跟上。 我确实有一个单独的线程不断地读取文件。 我尝试了几种解决方案,例如:

def get_line():
last_line = ""
with open(mypath1 + "log.log", "r") as f:
    for line in f:
        pass
    last_line = line[:-1]
    return last_line

但这还不够快。我绝不是一个专业的程序员,只是边走边学。 任何建议将不胜感激

【问题讨论】:

  • 这篇文章可能对你有帮助,Reading changing file in Python 3 and Python 2
  • 谢谢,但我的问题是速度,而不是功能
  • 欢迎来到 SO @blake_won!请编辑您的问题以阐明您想要完成的任务。例如,“如何保证我始终拥有来自日志文件的最新信息?”

标签: python plugins


【解决方案1】:

尝试保持文件打开并且只继续读取而不是总是从文件开头重新读取

def get_line(f=open('log.log')):
    for line in f:
        pass
    return line[:-1]

演示(也可运行at repl.it):

def write(*lines):
    with open('log.log', 'a') as f:
        for line in lines:
            print(line, file=f)

write('foo', 'bar', 'last1')
print(get_line())
write('foo', 'bar', 'last2')
print(get_line())

输出:

last1
last2

更健壮的版本,如果文件为空,则返回空字符串,如果仍然是最后一行(即,如果没有新行),则重复上一行:

def get_line(f=open('log.log'), cache=['']):
    for cache[0] in f:
        pass
    return cache[0][:-1]

演示at repli.it.

【讨论】:

  • 我试一试,我马上告诉你我的发现!
  • @blake_won 最后也试试新版本,那可能会更好。第一个版本是一个概念证明。
  • 我尝试复制我一直遇到的问题,您的代码似乎很有魅力,非常感谢!一个问题,如果你愿意放纵我,我的“with open as f”代码每次都打开一个文件,我明白了,但你的为什么不呢?它在参数中有 f=open()
  • @blake_won 默认参数是在定义函数时评估的,而不是每次调用函数时。它可以是gotcha,但您也可以利用它来发挥自己的优势。
  • 非常感谢,我已经写了 600 行脚本,这是一个真正的救命稻草,你不仅基本上为我解决了问题,而且还教会了我一些新东西。你是stackoverflow应该是什么的一个典型例子
猜你喜欢
  • 2012-05-11
  • 1970-01-01
  • 2016-05-09
  • 1970-01-01
  • 2011-11-02
  • 2016-02-22
  • 1970-01-01
  • 1970-01-01
  • 2013-05-21
相关资源
最近更新 更多