Несколько файлов для одного аргумента в argparse в Python 2.7

попытка сделать аргумент в argparse, где можно ввести несколько имен файлов, которые можно прочитать. В этом примере я просто пытаюсь распечатать каждый из файловых объектов, чтобы убедиться, что он работает правильно, но я получаю ошибку:

error: unrecognized arguments: f2.txt f3.txt

. Как я могу заставить его узнать их всех?

моя команда в терминале для запуска программы и чтения нескольких файлов

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

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()

Я nargs='?' b / c я хочу, чтобы это было любое количество файлов, которые можно использовать . Если я изменюсь add_argument в:

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

тогда я могу напечатать их как строки, но я не могу заставить его работать с '?'

2 ответов


если ваша цель-чтение один или несколько читать файлы, вы можете попробовать это:

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

nargs='+' собирает все аргументы командной строки в список. Также должен быть один или несколько аргументов или будет создано сообщение об ошибке.

type=argparse.FileType('r') пытается открыть каждый аргумент в виде файла для чтения. Он будет генерировать сообщение об ошибке, если argparse не может открыть файл. Вы можете использовать это для проверки того, является ли аргумент допустимым и читаемым файл.

альтернативно, если ваша цель-прочитать ноль или больше читать файлы, вы можете просто заменить nargs='+' С nargs='*'. Это даст вам пустой список, если аргументы командной строки не указаны. Возможно, вы можете открыть stdin, если вам не дали никаких файлов - если это так, просто добавьте default=[sys.stdin] в качестве параметра add_argument.

а затем обработать файлы в списке:

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

подробнее о nargs: https://docs.python.org/2/library/argparse.html#nargs

подробнее о типе:https://docs.python.org/2/library/argparse.html#type


просто нужно было убедиться, что есть хотя бы один аргумент

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