2013-10-29 19 views
9

使用argparse.add_argument方法的type參數,您可以要求一個參數是一個可讀的文件:如何獲得文件名以argparse同時指定類型的文件類型=(...)這說法

parser.add_argument('--sqlite-file', type=argparse.FileType('r')) 

由於指定此類型的好處,argparse檢查是否可以讀取文件,如果不是,則顯示錯誤給用戶。

有沒有辦法獲得傳入的文件名而不是io.TextIOWrapperio.BufferedReader的實例?

由於文件名出現在解析器的字符串表示中('sqlite_file': <_io.TextIOWrapper name='data/export.sqlite' ...'sqlite_file': <_io.BufferedReader name='data/export.sqlite' ...>),應該可以。

怎麼辦?

+0

http://bugs.python.org/issue13824眺望FileTYpe'的'而不實際打開文件檢查的可能性。我提出的解決方案是使用'os.access'來測試文件名。 – hpaulj

回答

15

是的,在文件對象上使用.name attribute

演示:

>>> import argparse 
>>> parser = argparse.ArgumentParser() 
>>> parser.add_argument('--sqlite-file', type=argparse.FileType('r')) 
_StoreAction(option_strings=['--sqlite-file'], dest='sqlite_file', nargs=None, const=None, default=None, type=FileType('r'), choices=None, help=None, metavar=None) 
>>> args = parser.parse_args(['--sqlite-file', '/tmp/demo.db']) 
>>> args.sqlite_file 
<_io.TextIOWrapper name='/tmp/demo.db' mode='r' encoding='UTF-8'> 
>>> args.sqlite_file.name 
'/tmp/demo.db'