2013-10-29 6 views
9

için FileType (...) okunabilir bir dosya olarak Bu tür belirtmenin bir yararı, argparse, dosyanın okunup okunamayacağını denetler ve değilse kullanıcıya bir hatayı gösterir.şeklini belirlerken argparse ile dosya adını almak nasıl =, bir argüman gerektirebilir <code>argparse.add_argument</code> yöntemin <code>type</code> parametresini kullanma bu argüman

io.TextIOWrapper veya io.BufferedReader örneği yerine geçirilen dosya adını elde etmenin bir yolu var mı?

Dosya adı ayrıştırıcının dize halinde göründüğünden ('sqlite_file': <_io.TextIOWrapper name='data/export.sqlite' ... veya 'sqlite_file': <_io.BufferedReader name='data/export.sqlite' ...>) mümkün olmalıdır.

Nasıl yapmalı?

+0

http://bugs.python.org/issue13824 aslında dosyayı açmadan kontrol FileTYpe' 'olasılığı içine bakar. Burada önerdiğim çözüm, dosya adını test etmek için 'os.access' kullanmaktı. – hpaulj

cevap

15

Evet, dosya nesnesindeki .name attribute kullanın.

Demo:

>>> 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'