Как разобрать список файлов с помощью argparse.FileType () - PullRequest
0 голосов
/ 16 марта 2020

С помощью следующего кода я пытаюсь проанализировать несколько аргументов, которые основаны на вводе пользователя. Одним из таких аргументов является получение нескольких файлов и их чтение с использованием argparse.Filetype ('r'). Это прекрасно работает при получении одного файла в качестве входных данных, но я пытаюсь сделать так, чтобы сценарии могли получить один или несколько файлов, следовательно, nargs = '+'.

parser = argparse.ArgumentParser(description='nanana')
parser.add_argument('files', type=argparse.FileType('r'), nargs='+',
                    help='The files which should be converted.')
parser.add_argument("--csvoutput", type=util.str2bool, nargs='?',
                    const=True, default=False, dest='boolean_switch',
                    help="Write file to CSV File.")
parser.add_argument('-v', '--verbose', dest='verbose', action='store_true',
                    help='Enable verbose output.')
root = tk.Tk()
root.withdraw()
root.call('wm', 'attributes', '.', '-topmost', True)
file_path = filedialog.askopenfilenames()
var = root.tk.splitlist(file_path)
file_list = []
for f in var:
    file_list.append(f)
arguments = parser.parse_args(['--csvoutput', '-v', file_list])
create_file(arguments.files, arguments.boolean_switch)

При запуске этого сценария я получить следующее сообщение об ошибке:

Convert.py: ошибка: файлы аргументов: недопустимое значение FileType ('r'):

Это, вероятно, потому что argparse.FileType ( 'r') не может обработать список файлов, но я не уверен, что использовать в противном случае

1 Ответ

2 голосов
/ 16 марта 2020

Это потому, что вы буквально пропускаете список Python как file_list, поэтому parse_args получает вложенный список вместо плоского списка argv, например, где он ожидает ['--csvoutput', '-v', 'foo.txt', 'bar.txt'] вы даете его ['--csvoutput', '-v', ['foo.txt', 'bar.txt']].

Объединение двух списков или (в достаточно недавней версии python) распаковка file_list внутри:

arguments = parser.parse_args(['--csvoutput', '-v', *file_list])
...