python - 使用 optparse 将 stdin 和 stdout 重定向到 python 中的文件的一致方法

标签 python stdout stdin optparse

我有十几个程序可以通过标准输入或选项接受输入,我想以类似的方式为输出实现相同的功能。

optparse 代码如下所示:

parser.add_option('-f', '--file',
       default='-',
       help='Specifies the input file.  The default is stdin.')
parser.add_option('-o', '--output',
       default='-',
       help='Specifies the output file.  The default is stdout.')

其余的适用代码如下所示:

if opts.filename == '-':
    infile = sys.stdin
else:
    infile = open(opts.filename, "r")

if opts.output == '-':
    outfile = sys.stdout
else:
    outfile = open(opts.output, "w")

此代码工作正常,我喜欢它的简单性 - 但我无法找到对任何使用默认值“-”输出以指示标准输出的人的引用。这是一个很好的一致解决方案,还是我忽略了更好或更期望的东西?

最佳答案

对于输入文件,您可以使用 fileinput模块。它遵循输入文件的通用约定:如果没有给出文件或文件名是“-”,它会读取标准输入,否则它会从命令行给出的文件中读取。

不需要 -f--file 选项。如果您的程序总是需要一个输入文件,那么它不是一个选项。

-o--output 用于指定the output file name in various programs .

选择解析

#!/usr/bin/env python
import fileinput
import sys
from optparse import OptionParser

parser = OptionParser()
parser.add_option('-o', '--output',
    help='Specifies the output file.  The default is stdout.')
options, files = parser.parse_args()
if options.output and options.output != '-':
   sys.stdout = open(options.output, 'w')

for line in fileinput.input(files):
    process(line)

参数分析

argparse模块允许您明确指定文件作为参数:

#!/usr/bin/env python
import fileinput
import sys
from argparse import ArgumentParser

parser = ArgumentParser()
parser.add_argument('files', nargs='*', help='specify input files')
group = parser.add_mutually_exclusive_group()
group.add_argument('-o', '--output', 
    help='specify the output file.  The default is stdout')
group.add_argument('-i', '--inplace', action='store_true',
    help='modify files inplace')
args = parser.parse_args()

if args.output and args.output != '-':
   sys.stdout = open(args.output, 'w')

for line in fileinput.input(args.files, inplace=args.inplace):
    process(line)

注意:我在第二个例子中添加了--inplace选项:

$ python util-argparse.py --help
usage: util-argparse.py [-h] [-o OUTPUT | -i] [files [files ...]]

positional arguments:
  files                 specify input files

optional arguments:
  -h, --help            show this help message and exit
  -o OUTPUT, --output OUTPUT
                        specify the output file. The default is stdout
  -i, --inplace         modify files inplace

关于python - 使用 optparse 将 stdin 和 stdout 重定向到 python 中的文件的一致方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7862987/

相关文章:

c - C scanf() 格式化的行为

python - 如何继续关闭子线程以关闭标准输入文件描述符?

python - PyCharm 调试器因 AttributeError 而失败

python - 用matplotlib去除x轴和y轴黑线

python - 并行 Selenium 测试的指纹问题

python - 将所有 stdout/stderr 全局重定向到记录器

java - 检测标准输入的空输入

python - 为什么 Pandas get_dummies 函数不执行 'pivot' ?

android - 使用 NDK 捕获标准输出/标准错误

java - 将字节流输出到标准输出