打印到stdout或文件而不重复代码

时间:2015-05-26 06:13:58

标签: python

我正在使用以下签名

在Python中编写函数
def print_results(input_file, output=None)

参数input_file只是一个文本文件,output也是如此。如果提供了输出文件,我想在那里写结果。否则,我想将它们打印到标准输出。

我想这样做,我不必重复代码。截至目前,该函数看起来像这样:

def print_results(input_file, output=None):
    // Do some computation
    if output:
        with open(output) as out:
            // Print results to output file
    else:
        // Print results to standard output

有没有办法合并我打印结果的部分,这样只需要做一次?

3 个答案:

答案 0 :(得分:2)

使用当前代码您无法轻松,因为out的范围仅限于with - 阻止。因此,让您的函数接受流,而不是文件名。比起来容易:

def print_results(input_file, outf = sys.stdout):
    # Print results to outf

这也将使您的代码具有通用性,因此它将接受StringIO对象。

要打印到标准输出,请使用以下功能:

print_results(...)

要打印到文件,请使用:

with open(output) as outf:
    print_results(..., outf=outf)

答案 1 :(得分:0)

使用sys.stdout:

if not output:
  output=sys.stdout
else:
  output=open(output, 'w') 

print(data,  file=output) 


if output is not sys.stdout: 
  output.close()

答案 2 :(得分:0)

在python 3.x中print是一个函数,因此您可以轻松地减少if/else语句。

def print_results(input_file, output=None):
    // Do some computation
    if output:
        out = open(output,mode) #mode which ever you want to open
    print_func = out.write if output else print
    print_func(result)  //print result to std output or file

在python 2.x中print只是一个声明,所以要实现这一点有点复杂,你必须从未来的模块导入打印功能。在代码的顶部使用:

from __future__ import print_function