Skip to content

Instantly share code, notes, and snippets.

@tsuchm
Created December 6, 2018 00:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tsuchm/4b7b935ab6528aeee78381fd6e451696 to your computer and use it in GitHub Desktop.
Save tsuchm/4b7b935ab6528aeee78381fd6e451696 to your computer and use it in GitHub Desktop.
# -*- encoding: utf-8 -*-
import argparse
import sys
def parse_args():
p = argparse.ArgumentParser()
p.add_argument('inputs', type=str, nargs='*', help='[input] text files')
return p.parse_args()
def xxx(fp):
# Do something
if __name__ == '__main__':
args = parse_args()
if len(args.inputs) > 0:
for file in args.inputs:
with open(file, 'r', encoding='utf-8') as fp:
xxx(fp)
else:
xxx(sys.stdin)
@elnikkis
Copy link

elnikkis commented Dec 7, 2018

# -*- coding: utf-8 -*-
import sys

def parse_args():
    import argparse
    parser = argparse.ArgumentParser()
    parser.add_argument('inputs', type=argparse.FileType('r'), nargs='*', default=[sys.stdin], help='[input] text files')
    #parser.add_argument('inputs', type=argparse.FileType('r'), nargs='*', help='[input] text files')
    return parser.parse_args()

if __name__ == '__main__':
    args = parse_args()
    print(type(args.inputs))
    print(args.inputs)

このようなコードで同じような動作ができます。問題は、argparse.FileTypeはスクリプト終了まで全ファイルをopenしっぱなしっていうところですけど(これはFileTypeのissueにのってたはず、改善されたのかな……?)。

実行結果:

 $ python file-or-stdin.py
<class 'list'>
[<_io.TextIOWrapper name='<stdin>' mode='r' encoding='UTF-8'>]
$ python file-or-stdin.py *.csv
<class 'list'>
[<_io.TextIOWrapper name='Happiness.csv' mode='r' encoding='UTF-8'>, <_io.TextIOWrapper name='cereal.csv' mode='r' encoding='UTF-8'>]

ちなみに、コメントアウトしている行を代わりに使うと、下のように使えます。

$ python file-or-stdin.py -
<class 'list'>
[<_io.TextIOWrapper name='<stdin>' mode='r' encoding='UTF-8'>]

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment