14

stdinまたはオプションを介して入力を受け入れることができるプログラムが12個ありますが、出力に対して同様の方法で同じ機能を実装したいと思います。

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")

このコードは正常に機能し、その単純さが気に入っていますが、stdoutを示す出力にデフォルト値の「-」を使用している人への参照を見つけることができませんでした。これは一貫性のある優れたソリューションですか、それとも私はより良いまたはより期待される何かを見落としていますか?

4

2 に答える 2

15

入力ファイルには、モジュールを使用できfileinputます。入力ファイルの一般的な規則に従います。ファイルが指定されていないか、ファイル名が「-」の場合は stdin を読み取り、それ以外の場合はコマンドラインで指定されたファイルから読み取ります。

-f--fileオプションは必要ありません。プログラムが常に入力ファイルを必要とする場合、それはオプションではありません。

-oさまざまなプログラムで出力ファイル名--outputを指定するために使用されます。

オプトパース

#!/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

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)

注: --inplace2 番目の例にオプションを追加しました。

$ 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
于 2011-10-23T03:28:52.260 に答える
12

使用できる場合argparse(つまり、Python 2.7+)、必要なものに対するサポートが組み込まれています:argparseドキュメントから直接

ファクトリは、のFileType型引数に渡すことができるオブジェクトを作成しますArgumentParser.add_argument()。タイプとしてオブジェクトを持つ引数は、FileTypeコマンドライン引数を開きます […]オブジェクトは疑似引数 '-' を理解し、これを読み取り可能なオブジェクトと書き込み可能なオブジェクトFileTypeの sys.stdin に自動的に変換します。FileTypesys.stdoutFileType

だから私のアドバイスは、単に使用することです

import sys
import argparse

parser = argparse.ArgumentParser()
parser.add_argument('file', type=argparse.FileType('r'),
    help="Specifies the input file")
parser.add_argument('output', type=argparse.FileType('w'),
    help="Specifies the output file")
args = parser.parse_args(sys.argv[1:])

# Here you can use your files
text = args.file.read()
args.output.write(text)
# … and so on

それからあなたはすることができます

> python spam.py file output 

から読み取り、または fileに出力するにはoutput

> echo "Ni!" | python spam.py - output  

、またはに読み込ん"Ni!"で出力するoutput

> python spam.py file -

…</p>

-関連するストリームに使用することは、多くのプログラムが使用する規則であるため、それは良いことです。指摘したい場合は、help文字列に追加します。

  parser.add_argument('file', type=argparse.FileType('r'),
    help="Specifies the input file, '-' for standard input")

参考までに、使用メッセージは

> python spam.py -h
usage: [-h] file output

positional arguments:
  file        Specifies the input file, '-' for standard input
  output      Specifies the output file, '-' for standard output

optional arguments:
  -h, --help  show this help message and exit
于 2012-07-30T12:37:21.597 に答える