web-dev-qa-db-fra.com

Gérer les espaces dans l'entrée argparse

En utilisant python et argparse, l'utilisateur peut entrer un nom de fichier avec -d comme indicateur.

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

Cependant, cela a échoué lorsque le chemin comprenait des espaces. Par exemple.

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

REMARQUE: les espaces provoqueraient une erreur (l'indicateur prend uniquement en entrée 'C: SMTHNG\Name').

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

Cela m'a pris plus de temps que nécessaire pour trouver la solution à ce problème ... (je n'ai pas trouvé de questions/réponses pour cela, donc je fais mon propre post)

24
ofer.sheffer

Solution simple: argparse considère une chaîne remplie d'espace comme un seul argument si elle est encapsulée par des guillemets.

Cette entrée a fonctionné et "résolu" le problème:

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

AVIS: l'argument "" l'entoure.

23
ofer.sheffer

Pour ceux qui ne peuvent pas analyser les arguments et qui obtiennent toujours "erreur: arguments non reconnus:" J'ai trouvé une solution de contournement:

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

puis quand vous voulez l'utiliser, faites-le

' '.join(opts.dmp)
35
Illarion Kovalchuk

Je suis aussi tombé sur ce problème aujourd'hui.

-d "foo bar"

n'a pas aidé. Je devais ajouter le signe égal

-d="foo bar"

et puis ça a marché.

3
Uwe Brandt

Après quelques expériences (python 2.7 Win10), j'ai découvert que la règle d'or est de mettre des guillemets ("") autour des arguments qui contiennent des espaces et de faire PAS mettre si il n'y a pas d'espaces dans l'argument. Même si vous passez une chaîne/un chemin. Mettre des guillemets simples ('') est également une mauvaise idée, au moins pour Windows.

Petit exemple: python script.py --path ....\Some_Folder\--string "Voici une chaîne"

1
cy8g3n