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 de fichier pour s'assurer qu'il fonctionne correctement, mais j'obtiens l'erreur:

error: unrecognized arguments: f2.txt f3.txt

. Comment puis-je obtenir à reconnaître chacun d'eux?

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 n'importe quel nombre de fichiers qui peuvent être utilisés . Si je change d' add_argument à:

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

alors je peux les imprimer comme des ficelles mais je ne peux pas le faire fonctionner avec"?'

17
demandé sur vabada 2014-11-04 06:36:48

2 réponses

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

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

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

type=argparse.FileType('r') essaie d'ouvrir chaque argument de la lecture du fichier. 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 valide et lisible fichier.

Sinon, si votre but est de lire zéro ou plus fichiers lisibles, vous pouvez simplement remplacer nargs='+'nargs='*'. Cela vous donnera une liste vide si aucun argument de ligne de commande n'est fourni. Peut - être que vous pourriez vouloir ouvrir stdin si vous n'êtes pas donné des fichiers-Si donc il suffit d'ajouter default=[sys.stdin] comme paramètre add_argument.

Et puis pour traiter les fichiers dans la liste:

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

en savoir Plus sur nargs: https://docs.python.org/2/library/argparse.html#nargs

en savoir Plus sur type: https://docs.python.org/2/library/argparse.html#type

29
répondu mcho421 2014-11-19 03:23:36

Juste eu à rendre sûr qu'il y a au moins un argument

parser.add_argument('file',nargs='*')
1
répondu O.rka 2014-11-04 04:02:39