在Python中打印到文件:redirect vs print的文件参数vs write

max*_*max 6 python redirect stdout file python-3.x

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

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

完全重定向,我在这里看到:

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()
Run Code Online (Sandbox Code Playgroud)

每个打印声明中的重定向:

fsock = open('out.log', 'w')
print(x, file = fsock)
# and many more print calls
Run Code Online (Sandbox Code Playgroud)

写功能:

fsock = open('out.log', 'w')
fsock.write(str(x))
# and many more write calls
Run Code Online (Sandbox Code Playgroud)

Jim*_*nis 6

我不希望这些方法之间存在任何持久的性能差异.

第一种方法的优点是,您依赖的任何合理良好的代码(您导入的模块)将自动获取您所需的重定向.

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

第三种方法......并且扩展了所有输出应该在为此目的定义的特定函数和类方法中生成的原则......可能是最好的.

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

例如,我偶尔会有一些以上的东西,我写的东西是从各种来源执行一些复杂的查询和数据收集并打印报告......说出差异...后来需要调整成可以吐的形式以某种形式输出数据(例如YAML/JSON),这些数据可以输入到其他系统中(例如,用于将一个数据源与另一个数据源进行协调.

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