Есть ли лучший способ использовать glob.glob в python для получения списка файлов нескольких типов, таких как .txt, .mdown и .markdown? Прямо сейчас у меня есть что-то вроде этого:
projectFiles1 = glob.glob( os.path.join(projectDir, '*.txt') )
projectFiles2 = glob.glob( os.path.join(projectDir, '*.mdown') )
projectFiles3 = glob.glob( os.path.join(projectDir, '*.markdown') )
Ответы:
Может быть, есть лучший способ, но как насчет:
Возможно, есть другой способ, поэтому подождите, если кто-то другой придумает лучший ответ.
источник
files_grabbed = [glob.glob(e) for e in ['*.pdf', '*.cpp']]
[f for f_ in [glob.glob(e) for e in ('*.jpg', '*.mp4')] for f in f_]
Если вам нужно указать путь, зациклите шаблоны соответствия и оставьте соединение внутри цикла для простоты:
источник
glob
возвращает список: почему бы просто не запустить его несколько раз и объединить результаты?источник
ProjectFiles
наprojectFiles
, но отличное решение.Цепочка результатов:
Затем:
источник
chain.from_iterable
. Так что это похоже, но менее читабельноit.chain(*(glob.iglob(pattern) for pattern in patterns))
.Так много ответов, которые предлагают использовать столько же раз, сколько число расширений, я бы предпочел вместо одного:
источник
с шаром это не возможно. Вы можете использовать только:
* соответствует всему
? соответствует любому отдельному символу
[seq] соответствует любому символу в seq
[! seq] соответствует любому символу не в seq
используйте os.listdir и регулярное выражение для проверки шаблонов:
источник
itertools
потому что последующие изменения шаблона также должны быть хакерскими (скажем, вы хотите использовать верхний и нижний регистр) , О, и это может быть чище написать'.*\.(txt|sql)'
Например, для
*.mp3
и*.flac
для нескольких папок вы можете сделать:Идея может быть расширена на большее количество расширений файлов, но вы должны убедиться, что комбинации не будут совпадать с любым другим нежелательным расширением файла, которое у вас может быть в этих папках. Так что будьте осторожны с этим.
Чтобы автоматически объединить произвольный список расширений в один шаблон glob, вы можете сделать следующее:
источник
Однострочник, Просто ради этого ..
вывод:
источник
Придя сюда за помощью, я сделал собственное решение и хотел поделиться им. Это основано на ответе user2363986, но я думаю, что это более масштабируемо. Это означает, что если у вас есть 1000 расширений, код все равно будет выглядеть несколько элегантно.
источник
directoryPath = "/Users/bla/bla/images_dir*."
источник
Несмотря на то, что глобус Python по умолчанию не следует за глобусом Bash, вы можете сделать это с другими библиотеками. Мы можем включить скобки в глобусе wcmatch .
Вы даже можете использовать расширенные шаблоны glob, если это ваше предпочтение:
источник
recursive
флагglob.GLOBSTAR
флагЯ выпустил Formic, который реализует множественные включения аналогично FileSet и Globs Apache Ant .
Поиск может быть реализован:
Поскольку реализован полный глобус Ant, вы можете включать разные каталоги в каждый шаблон, поэтому вы можете выбрать только эти файлы .txt в одном подкаталоге и .markdown в другом, например:
Надеюсь, это поможет.
источник
Следующие функции
_glob
globs для нескольких расширений файлов.источник
Это
pathlib
решение Python 3.4+ :Также игнорируются все имена файлов, начинающиеся с
~
.источник
Вот вариант ответа Пэта на одну строку для понимания списка (который также включает в себя то, что вы хотели поместить в определенную директорию проекта):
Вы перебираете extensions (
for ext in exts
), а затем для каждого расширения берете каждый файл, соответствующий шаблону glob (for f in glob.glob(os.path.join(project_dir, ext)
).Это короткое решение , без лишних циклов for, вложенных списочных пониманий или функций, которые загромождают код. Просто чистый, выразительный, питонический дзен .
Это решение позволяет вам иметь собственный список,
exts
который может быть изменен без обновления вашего кода. (Это всегда хорошая практика!)Понимание списка такое же, как и в решении Лорана (за которое я проголосовал). Но я бы сказал, что обычно нет необходимости выделять одну строку в отдельную функцию, поэтому я предоставляю это в качестве альтернативного решения.
Бонус:
Если вам нужен поиск не только по одному каталогу, но и по всем подкаталогам, вы можете передать
recursive=True
и использовать глобальный символ**
1 :Это будет вызывать
glob.glob('<project_dir>/**/*.txt', recursive=True)
и так далее для каждого расширения.1 Технически
**
символ глобуса просто соответствует одному или нескольким символам, включая косую черту/
(в отличие от*
символа глобуса в единственном числе ). На практике вам просто нужно помнить, что до тех пор, пока вы окружаете**
косыми чертами (разделителями пути), он соответствует нулю или большему количеству каталогов.источник
Нет
glob
, но вот еще один способ использования списочного понимания:источник
Вы можете попытаться составить ручной список, сравнивая расширение существующих с теми, которые вам нужны.
источник
https://docs.python.org/3.5/library/functools.html#functools.reduce https://docs.python.org/3.5/library/operator.html#operator.add
источник
Для
glob
нескольких типов файлов вам нужно вызыватьglob()
функцию несколько раз в цикле. Поскольку эта функция возвращает список, вам нужно объединить списки.Например, эта функция выполняет работу:
Простое использование:
Вы также можете использовать,
glob.iglob()
чтобы иметь итератор:источник
Используйте список расширений и перебирайте
источник
Вы можете использовать фильтр:
источник
Вы также можете использовать
reduce()
так:это создает список
glob.glob()
для каждого шаблона и сводит их к одному списку.источник
Один глобус, много расширений ... но несовершенное решение (может совпадать с другими файлами).
источник
У меня была такая же проблема, и это то, что я придумал
источник
Еще одно решение (используйте
glob
для получения путей, используя множественное совпадение,patterns
и объедините все пути в один список, используяreduce
иadd
):источник
Если вы используете,
pathlib
попробуйте это:источник
По результатам, полученным в результате эмпирических испытаний, оказалось, что
glob.glob
это не лучший способ отфильтровать файлы по их расширениям. Некоторые из причин:Я проверил (для корректности и эффективности во времени) следующие
4
различные методы, чтобы отфильтровать файлы по расширениям и поместить их вlist
:Запустив код выше на моем ноутбуке, я получил следующие авто-объяснительные результаты.
Самый быстрый способ отфильтровать файлы по расширениям, даже самый уродливый. Что, вложенные
for
циклы иstring
сравнение с использованиемendswith()
метода.Более того, как вы можете видеть, алгоритмы сглаживания (с шаблоном
E:\x\y\z\**/*[py][pyc]
) даже с2
заданным расширением (py
иpyc
) также возвращают неверные результаты.источник
источник
Это должно работать:
источник
Например:
Функция:
источник