在Python中打印到文件:重定向vs打印';s文件参数与写入
我有一大堆在Python中打印到文件:重定向vs打印';s文件参数与写入,python,file,redirect,python-3.x,stdout,Python,File,Redirect,Python 3.x,Stdout,我有一大堆print调用,我需要将它们写入文件,而不是stdout。(我根本不需要stdout) 我正在考虑三种方法。它们中的任何一个是否有任何优势(包括性能) 完全重定向,我看到: 在每个打印语句中重定向: fsock = open('out.log', 'w') print(x, file = fsock) # and many more print calls 写入功能: fsock = open('out.log', 'w') fsock.write(str(x)) # and man
print
调用,我需要将它们写入文件,而不是stdout
。(我根本不需要stdout
)
我正在考虑三种方法。它们中的任何一个是否有任何优势(包括性能)
完全重定向,我看到:
在每个打印语句中重定向:
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模块? < P>我认为语义是重要的: 我建议第一种方法用于在控制台上打印相同内容的情况。语义将是相同的。对于更复杂的情况,我将使用标准日志模块 第二种和第三种方法在打印文本行时有点不同第二种方法-
打印
添加换行符,而写入
不添加换行符
我将使用第三种方法以二进制或非文本格式编写,在大多数其他情况下,我将在打印语句中使用重定向。我不希望这些方法之间存在任何持久的性能差异 第一种方法的优点是,您所依赖的任何行为合理的代码(您导入的模块)都将自动获取您所需的重定向 第二种方法没有优势。它只适用于调试或一次性代码。。。这甚至不是一个好主意。您希望将输出决策整合到几个定义良好的地方,而不是在每次调用
print()
时分散在代码中。在Python3中,print()是一个函数而不是一个语句。这允许您重新定义它,如果您愿意的话。因此,如果需要,您可以def print(*args)
。例如,如果需要访问它,您还可以在自己的自定义打印()的定义中调用\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu.print()
第三种方法。。。通过扩展,您的所有输出都应该在为此目的定义的特定函数和类方法中生成的原则。。。这可能是最好的
您应该尽可能将输出和格式与核心功能分开。通过将它们分开,你可以重复使用你的核心。(例如,您可能从打算从文本/shell控制台运行的东西开始,然后需要为它提供Web UI、全屏(curses)前端或GUI。您也可以围绕它构建完全不同的功能…在结果数据需要以其本机形式(作为对象)返回的情况下)而不是作为文本(输出)拉入并重新解析为新对象
例如,我曾经不止一次地写过这样的东西,我写过这样的东西来执行一些复杂的查询和从各种来源收集数据,并打印一份报告……比如说差异……后来需要修改成一种形式,可以将数据以某种形式(如YAML/JSON)输出到其他系统中(例如,用于协调一个数据源与另一个数据源
如果从一开始,您就将主操作与输出和格式化分开,那么这种适应相对容易。否则它需要相当多的重构(有时相当于完全重写).如果您使用的是py3k read,则忘记添加我不久前提出的相关问题。如果有疑问,请配置文件。最后,我决定不使用日志记录
。我有多个文件要写入,而且我发现自己更容易管理。但谢谢您,我会记住这一点。
fsock = open('out.log', 'w')
fsock.write(str(x))
# and many more write calls