代码之家  ›  专栏  ›  技术社区  ›  max

在Python中打印到文件:重定向vs print的文件参数vs write

  •  6
  • max  · 技术社区  · 14 年前

    我有一堆 print 我需要写入文件而不是 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
    
    3 回复  |  直到 12 年前
        1
  •  6
  •   Jim Dennis    14 年前

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

    第一种方法的优点是,您所依赖的任何性能良好的代码(您导入的模块)都将自动接受您所需的重定向。

    第二种方法没有优势。它只适合调试或丢弃代码。。。甚至不是个好主意。您希望将输出决策合并到几个定义良好的地方,而不是在每次调用 print() 打印() 是一个函数而不是一个语句。这允许你重新定义它,如果你喜欢的话。所以你可以 def print(*args) 如果你愿意的话。你也可以打电话 __builtins__.print() 如果您需要访问它,在您自己的自定义定义内 ,例如。

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

    例如,我有不止一个偶然的地方,我写了一些东西来执行一些复杂的查询和数据收集从不同的来源和打印报告。。。说到差异。。。稍后需要调整成一种形式,这种形式可以以某种形式(如YAML/JSON)输出数据,这些数据可以输入到另一个系统(例如,用于协调一个数据源与另一个数据源)。

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

        2
  •  4
  •   Amber    14 年前

    从你在问题中使用的文件名来看,听起来你想创建一个日志文件。你考虑过巨蟒吗 logging

        3
  •  4
  •   Jiri    14 年前

    我认为语义很重要:

    我建议 当你打印相同的东西,你会打印到控制台的情况。语义是一样的。对于更复杂的情况,我将使用标准日志模块。

    第二种和第三种方法在打印文本行时有点不同。 第二种方法 - print write 没有。

    我会用 在主要编写二进制或非文本格式时,在大多数其他情况下,我会在print语句中使用redirect。