argparseのドキュメントには、ファイル引数のデフォルトが stdin/stdout で、テキスト エンコーディングのデフォルトが utf-8 であるというアプローチが示されています。
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('infile', nargs='?', type=argparse.FileType('r'),
... default=sys.stdin)
>>> parser.add_argument('outfile', nargs='?', type=argparse.FileType('w'),
... default=sys.stdout)
>>> parser.parse_args([])
Namespace(infile=<_io.TextIOWrapper name='<stdin>' encoding='UTF-8'>,
outfile=<_io.TextIOWrapper name='<stdout>' encoding='UTF-8'>)
ただし、この OS X (10.7.5) システムでは、このコードは<stdin> <stdout>
ascii コーデックで生成されます。たとえば、出力ストリームに中国語やスカンジナビアの文字が含まれている場合、端末では問題なく表示されますが、stdout をファイルにリダイレクトすると、ASCII コーデック エラーが発生します。誰かがこれを回避するルートを見つけましたか?
(Python コードから直接 utf-8 ファイルを書き込むことは問題ではありません。私は を使用していますcodecs.open(str_path, "w", 'UTF-8')
)