parse_args все .png файлы из аргумента парсера - PullRequest
0 голосов
/ 20 сентября 2018

Я хотел бы получить arg.pics, который возвращает что-то вроде ['pic1.png', 'pic2.png', 'pic3.png'] (для произвольного анализа всех файлов в формате .png) после запуска следующего (test.py):

import argparse
import os

def parser_arg():
    par = argparse.ArgumentParser()
    parser = par.add_argument_group('pictures')
    parser.add_argument("-p", "--pics", nargs="+", help="picture files", required=True)
    arguments = par.parse_args()
    return arguments

args = parser_arg()

Ипосле запуска сценария через командную строку и ввода

python test.py -p ../User/Desktop/Data/*.png

тогда args.pics возвращает ['../User/Desktop/Data/*.png'] вместо ..

Использую ли я правильный подход?Я слышал, что использование *.png будет расширено до файлов .png после ввода, но, похоже, это не так с моей стороны.

Редактирование: Я использую Anaconda Promptв Windows 10, если это поможет.

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Есть пара вещей, которые могут происходить.Одна возможность состоит в том, что ../User/Desktop/Data/*.png не соответствует ни одному файлу, поэтому не раскрывается.Это может произойти только в UNIX-подобной оболочке (или, я полагаю, в PowerShell).Другая возможность заключается в том, что вы используете cmd.exe в Windows, которая просто не использует подстановочные знаки вообще.Учитывая, что вы используете приглашение Anaconda в Windows, я бы предпочел использовать в качестве объяснения последнюю возможность.

Поскольку вы ищете список всех PNG в папке, вам не нужно полагаться наоболочка вообще.Есть много способов сделать то же самое в Python, с интеграцией в argparse.

* 1009 и без нее. Давайте начнем с реализации функции листинга.Для данного каталога есть несколько способов получить список всех PNG в нем:
  1. Использовать glob.glob ( рекомендуемая опция ).Это может быть использовано в подкаталогах или нет, в зависимости от того, что вы хотите:

    mydir = '../User/Desktop/Data/'
    pngs = glob.glob(os.path.join(mydir, '*.png'))
    

    Чтобы перейти в подпапки, просто добавьте параметр recursive=True только для ключевых слов.

  2. Используйте os.walk.Это гораздо более гибко (и, следовательно, требует больше работы), но также позволяет использовать рекурсивные или нерекурсивные решения:

    mydir = '../User/Desktop/Data/'
    pngs = []
    for path, dirs, files in os.walk(mydir):
        pngs.extend(f for f in files if f.lower().endswith('.png'))
        del dirs[:]
    

    Чтобы включить рекурсию, просто удалите строку del dirs[:], которая подавляет поиск в подкаталогах.

  3. Связанный метод, который всегда нерекурсивен, заключается в использовании os.listdir, что является грубым эквивалентом Pythons для команд ls или dir:

    mydir = '../User/Desktop/Data/'
    pngs = [f for f in os.listdir(mydir) if f.lower().endswith('.png')]
    

    Эта версия не проверяет, является ли что-то файлом.Предполагается, что у вас нет имен папок, заканчивающихся на .png.

Допустим, вы выбрали один из этих методов и создали функцию, которая принимает папку и возвращает список файлов.:

def list_pngs(directory):
    return glob.glob(os.path.join(directory, '*.png'))

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

  1. Просто возьмите все свои каталоги из аргумента и выведите их впоследствии:

    parser.add_argument("-p", "--pics", action='store', help="picture files", required=True)
    

    После обработки аргументов:

    print(list_pngs(args.pics))
    
  2. Интеграция напрямую в argparse с аргументом type:

    parser.add_argument("-p", "--pics", action='store', type=list_pngs, help="picture files", required=True)
    

    Теперь вы можете использовать аргумент напрямую, поскольку он будет преобразован в список напрямую:

    print(args.pics)
    
0 голосов
/ 20 сентября 2018

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

Командная строка Anaconda по умолчанию использует cmd.exe, которая не поддерживает расширение по шаблону.Вместо этого вы можете использовать PowerShell , который понимает подстановочные знаки.Кроме того, вы можете выполнить расширение в своем приложении, как описано в answer .

Mad Physicist.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...