如何抽象stdin/stdout和文件?
问题描述:
我想写一个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))
- 是代码管理资源是否正确?
- 如何正确处理字符编码?我想在utf-8中拥有一切。
- 上述代码有没有改进的余地?
答
我认为你需要这样做。你不需要使run()
本身成为@contextmanager
-所有它需要做的就是使用一个(或更多,fileinput.input
和redirect_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)
感谢您的信息。我正在使用'fileinput',因为可能有多个输入文件。主要目标是使脚本可管。我不确定我了解你对“@ contextmanager”的评论。你是否正在用目前的实现来说,我不需要'@ contextmanager'?还请你对字符编码进行评论? – Rad
我的意思是说,因为'fileinput.input()'和'redirect_stdout()'既是上下文管理器,也没有必要让'run()'也是。至于编码方面,如果'stdout'没有被重定向,你可能会遇到一个问题,这取决于'sys.stdout'的默认编码是用于你的操作系统的。对于文件,您可能必须使用['codecs.open()'](https://docs.python.org/3/library/codecs.html#codecs.open)以避免在读取和写入数据时出现编码问题/取决于它们包含的内容。为什么不尝试运行它并看看,而不是在这里提出假设性问题。 – martineau