2013-08-10 18 views
18

Używając python i argparse, użytkownik może wprowadzić nazwę pliku z opcją -d jako flagą.Obsługa spacji w argparse input

parser.add_argument("-d", "--dmp", default=None) 

Nie powiodło się, gdy ścieżka zawiera spacje. Na przykład.

-d C:\SMTHNG\Name with spaces\MORE\file.csv 

UWAGA: spacje spowodują błąd (flaga przyjmuje tylko "C: SMTHNG \ Nazwa" jako dane wejściowe).

error: unrecognized arguments: with spaces\MORE\file.csv 

Zajęło mi dłużej niż powinien znaleźć rozwiązanie tego problemu ... (nie znaleźliśmy Q & A dla niego tak robię mój własny post)

Odpowiedz

16

Proste rozwiązanie : argparse traktuje łańcuch wypełniony spacją jako pojedynczy argument, jeśli jest on enkapsulowany przez cudzysłowy.

Wejście to działało i "rozwiązać" problem:

-d "C:\SMTHNG\Name with spaces\MORE\file.csv" 

UWAGA: argument "" wokół niego.

+0

Jak zwykle przeczytać tutaj ... nie krępuj się akceptować swoją odpowiedź: D – Jblasco

+7

Tu nie chodzi o argparse; w ten sposób powłoki przetwarzają argumenty na większości systemów (i jak programy fałszują parsowanie w stylu powłoki w systemach, które nie mają prawdziwych powłok). Zanim przejdziesz do modułu 'argparse', twoja pierwotna wersja ma już 4 oddzielne argumenty, a argparse nie może nic z tym zrobić. – abarnert

+0

@abarnert, dziękuję za wejście. –

20

Dla tych, którzy nie potrafią analizować argumenty i jeszcze dostać „Błąd: nierozpoznanych argumentami:” Znalazłem rozwiązania:

parser.add_argument('-d', '--dmp', nargs='+', ...) 
opts = parser.parse_args() 

i wtedy, gdy chcesz go używać tylko zrobić

' '.join(opts.dmp) 
+3

ta odpowiedź jest lepsza od akceptowanej. – FuzzyAmi

+0

Co jeśli mam ciąg znaków typu: maam, który ma apostrof (?) W środku? – dorado

+1

@FuzzyAmi To nie jest lepsze. Po prostu to uzupełnia. Lubię obie odpowiedzi. Właściwie zdecydowałem się na zaakceptowaną odpowiedź. –

1

Wpadł dziś na ten problem.

-d "foo bar" 

nie pomogło. Musiałem dodać znak równości

-d="foo bar" 

, a następnie zadziałało.

+0

Jaka jest twoja konfiguracja? –

+0

python 3.5.1 na RHEL6 –

0

Po kilku eksperymentach (python 2.7 Win10) dowiedziałem się, że złotą zasadą jest umieszczanie cudzysłowów ("") wokół argumentów, które zawierają spacje i rób je, jeśli nie ma spacji w argumencie. Nawet jeśli podajesz ciąg/ścieżkę. Również umieszczanie pojedynczych cudzysłowów ("") jest złym pomysłem, przynajmniej dla Windows.

Mały przykład: pyton script.py --path .... \ Some_Folder \ --string „Oto idzie ciąg”