【问题标题】:printing to a file in Python: redirect vs print's file argument vs write在 Python 中打印到文件:重定向和打印文件参数与写入
【发布时间】:2011-05-04 17:01:33
【问题描述】:

我有一堆print 调用需要写入文件而不是stdout。 (我根本不需要stdout。)

我正在考虑三种方法。它们中的任何一个有什么优势(包括性能)吗?

完全重定向,我看到here:

import sys

saveout = sys.stdout
fsock = open('out.log', 'w')
sys.stdout = fsock

print(x)
# and many more print calls

# later if I ever need it:
# sys.stdout = saveout
# fsock.close()

在每个打印语句中重定向:

fsock = open('out.log', 'w')
print(x, file = fsock)
# and many more print calls

写函数:

fsock = open('out.log', 'w')
fsock.write(str(x))
# and many more write calls

【问题讨论】:

标签: python file redirect python-3.x stdout


【解决方案1】:

根据您在问题中使用的文件名,听起来您想要创建一个日志文件。您是否考虑过使用 Python logging 模块?

【讨论】:

  • 最后我决定不使用logging。我有多个文件要写入,我发现自己更容易管理。不过谢谢你,我会记住的。
【解决方案2】:

我认为语义很重要:

我会建议第一种方法用于打印要打印到控制台的相同内容的情况。语义将是相同的。对于更复杂的情况,我会使用标准的日志记录模块。

第二种和第三种方法有点不同,以防您打印文本行。 第二种方法 - print 添加换行符,write 不添加。

我将使用第三种方法主要编写二进制或非文本格式,在大多数其他情况下我会在打印语句中使用重定向。

【讨论】:

    【解决方案3】:

    我预计这些方法之间不会有任何持久的性能差异。

    第一种方法的优点是,您所依赖的任何行为良好的代码(您导入的模块)都会自动选择您想要的重定向。

    第二种方法没有优势。它只适用于调试或一次性代码......甚至不是一个好主意。您希望将输出决策合并到几个明确定义的位置,而不是在每次调用 print() 时分散在代码中。在 Python3 中,print() 是一个函数而不是语句。如果您愿意,这允许您重新定义它。因此,如果您愿意,可以def print(*args)。如果您需要访问它,也可以调用__builtins__.print(),例如在您自己的自定义print() 的定义中。

    第三种方法......以及扩展的原则,即所有输出都应该在您为此目的定义的特定函数和类方法中生成......可能是最好的。

    您应该尽可能将输出和格式与核心功能分开。通过将它们分开,您可以重复使用您的核心。 (例如,您可能从打算从文本/shell 控制台运行的东西开始,然后需要为其提供 Web UI、全屏(诅咒)前端或 GUI。您还可以构建完全不同的功能围绕它...在结果数据需要以其本机形式(作为对象)返回而不是作为文本(输出)拉入并重新解析为新对象的情况下。

    例如,我曾经不止一次写过一些东西来执行一些复杂的查询和从各种来源收集数据并打印报告……说差异……以后需要改编成表格这可能会以某种形式(例如 YAML/JSON)吐出数据,这些数据可以输入到其他系统中(例如,用于协调一个数据源与另一个数据源。

    如果从一开始就将主要操作与输出和格式化分开,那么这种适应相对容易。否则需要进行相当多的重构(有时相当于完全重写)。

    【讨论】:

      猜你喜欢
      • 2017-08-18
      • 2015-11-03
      • 2012-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-31
      相关资源
      最近更新 更多