如何抽象stdin / stdout和文件?

时间:2017-10-19 21:24:30

标签: python python-3.x io character-encoding

我试图编写一个Python脚本,让用户在stdin / stdout和文件之间切换输入/输出。但我不确定我的实施是否正确:

#!/usr/bin/python3

import fileinput
import sys

from contextlib import contextmanager
from contextlib import redirect_stdout


def foo(file):
    return ''.join([line for line in file])


@contextmanager
def run(input_file, output_file):
    stdin = '-' if input_file is None else input_file
    stdout = sys.stdout if output_file is None else open(output_file, 'w')
    with fileinput.input(stdin) as stdin, stdout:
        with redirect_stdout(stdout):
            print(foo(stdin))
  1. 代码管理资源是否正确?
  2. 如何正确处理字符编码?我想把所有东西都放在utf-8中。
  3. 上述代码还有改进的余地吗?

1 个答案:

答案 0 :(得分:1)

我认为你需要这样做。您不需要将run()本身设为@contextmanager - 它只需要使用一个(或更多,fileinput.inputredirect_stdout已经是{}}。我不确定你为什么使用fileinput.input,因为似乎只涉及一个输入文件。

from contextlib import redirect_stdout
import fileinput
import sys

def foo(file):
    return ''.join([line for line in file])

def run(input_file, output_file):
    stdin = '-' if input_file is None else input_file
    stdout = sys.stdout if output_file is None else open(output_file, 'w')
    with fileinput.input(stdin) as stdin, redirect_stdout(stdout):
        print(foo(stdin))

run('input.txt', 'output.txt')
run('input.txt', None)