2013-10-29 5 views
9

pomocą parametru metody argparse.add_argumenttype można wymagać argument być czytelny plik:Jak uzyskać nazwę pliku z argparse, określając typ = FileType (...) dla tego argumentu

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

Jak zaletą określenia tego typu, argparse sprawdza, czy plik można odczytać i wyświetla błąd dla użytkownika, jeśli nie.

Czy istnieje sposób na uzyskanie przekazanej nazwy pliku zamiast wystąpienia io.TextIOWrapper lub io.BufferedReader?

Ponieważ nazwa pliku pojawia się w reprezentacji ciągów analizatora składni ('sqlite_file': <_io.TextIOWrapper name='data/export.sqlite' ... lub 'sqlite_file': <_io.BufferedReader name='data/export.sqlite' ...>), powinno być możliwe.

Jak to zrobić?

+0

http://bugs.python.org/issue13824 patrzy możliwością 'FileTYpe' kontroli bez konieczności otwierania pliku. Rozwiązaniem, które zaproponowałem, było użycie 'os.access' do przetestowania nazwy pliku. – hpaulj

Odpowiedz

15

Tak, użyj obiektu .name attribute dla pliku.

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' 
Powiązane problemy