web-dev-qa-db-fra.com

Plusieurs fichiers pour un argument dans argparse Python 2.7

Essayer de faire un argument dans argparse où l'on peut entrer plusieurs noms de fichiers qui peuvent être lus. Dans cet exemple, j'essaie juste d'imprimer chacun des objets fichier pour m'assurer qu'il fonctionne correctement mais je obtenez l'erreur:

error: unrecognized arguments: f2.txt f3.txt

. Comment puis-je faire en sorte qu'ils les reconnaissent tous?

ma commande dans le terminal pour exécuter un programme et lire plusieurs fichiers

python program.py f1.txt f2.txt f3.txt

Script Python

import argparse

def main():
    parser = argparse.ArgumentParser()      
    parser.add_argument('file', nargs='?', type=file)
    args = parser.parse_args()

    for f in args.file:
        print f

if __name__ == '__main__':
    main()

J'ai utilisé nargs='?' b/c Je veux que ce soit un nombre illimité de fichiers pouvant être utilisés. Si je change add_argument à:

parser.add_argument('file', nargs=3)

alors je peux les imprimer sous forme de chaînes mais je ne peux pas le faire fonctionner avec '?'

22
O.rka

Si votre objectif est de lire un ou plusieurs fichiers lisibles, vous pouvez essayer ceci:

parser.add_argument('file', type=argparse.FileType('r'), nargs='+')

nargs='+' Rassemble tous les arguments de ligne de commande dans une liste. Il doit également y avoir un ou plusieurs arguments sinon un message d'erreur sera généré.

type=argparse.FileType('r') essaie d'ouvrir chaque argument sous forme de fichier à lire. Il générera un message d'erreur si argparse ne peut pas ouvrir le fichier. Vous pouvez l'utiliser pour vérifier si l'argument est un fichier valide et lisible.

Alternativement, si votre objectif est de lire zéro ou plusieurs fichiers lisibles , vous pouvez simplement remplacer nargs='+' Par nargs='*'. Cela vous donnera une liste vide si aucun argument de ligne de commande n'est fourni. Vous voudrez peut-être ouvrir stdin si aucun fichier ne vous est fourni - si c'est le cas, ajoutez simplement default=[sys.stdin] Comme paramètre à add_argument.

Et puis pour traiter les fichiers de la liste:

args = parser.parse_args()
for f in args.file:
    for line in f:
        # process file...

En savoir plus sur les nargs: https://docs.python.org/2/library/argparse.html#nargs

En savoir plus sur le type: https://docs.python.org/2/library/argparse.html#type

47
mcho421

Je devais juste m'assurer qu'il y avait au moins un argument

parser.add_argument('file',nargs='*')
0
O.rka