【问题标题】:How do I get my python script that continuously prints out data to output to a line limited text file instead of the standard terminal?如何让我的 python 脚本连续打印数据以输出到行有限的文本文件而不是标准终端?
【发布时间】:2020-08-23 15:51:57
【问题描述】:

在删除最旧的数据之前,我只需要允许文件包含 5000 行数据,因为 python 脚本会输出新数据(类似于“bash 中的tail 命令”)。我希望能够通过查看脚本输出到的文本文件来观察生成的数据。我需要它能够在后台运行,而不需要终端,或者在这种情况下是 ssh 会话,处于活动状态。在输出所有数据的python脚本的开头,我尝试了一些类似的东西:

import sys
sys.stdout = open(tail -c 1G > 'output.txt', 'w', buffering=1)

但无济于事。我不反对让 bash 脚本处理 python 文件,但我更愿意简单地运行 python 脚本并尽可能将其输出定向到上面提到的单独文件。

【问题讨论】:

  • 您在寻找旋转文件处理程序docs.python.org/3/library/…
  • 使用标准open(),您将不得不手动计算写入文件的行数,并在超过 5000 行时将所有行重写到新文件 - 以跳过开始行。
  • 也许吧。我刚读了你的链接。有没有办法将整个 python 脚本输出到日志文件?例如,将每个打印语句输出到日志文件。另外,日志文件是否随着python文件输出数据而更新?

标签: python linux bash stdout sys


【解决方案1】:

您描述的是circular buffer,它不是可以由文件支持的数据结构。文件可以被写入(覆盖某些现有内容)或附加到,但不可能在文件中更早地移动字节。 看起来类似的命令通常会写入一个临时文件,然后将内容复制回原始文件。

正如@Luv 所建议的,“将最后n 行数据保存到磁盘”的典型方法是rotate between several files。您可以在 Python 中执行此操作(他们建议使用 RotatingFileHandler 似乎是合理的)或在 Bash 中,例如使用 rotatelogs

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-22
    • 2011-08-21
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多