Несколько файлов для одного аргумента в 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)

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

Ответы

Ответ 1

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

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

Ответ 2

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

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