Вот вариант ответа Пэта на одну строку для понимания списка (который также включает в себя то, что вы хотели поместить в определенную директорию проекта):
import os, glob
exts = ['*.txt', '*.mdown', '*.markdown']
files = [f for ext in exts for f in glob.glob(os.path.join(project_dir, ext))]
Вы перебираете extensions ( for ext in exts
), а затем для каждого расширения берете каждый файл, соответствующий шаблону glob ( for f in glob.glob(os.path.join(project_dir, ext)
).
Это короткое решение , без лишних циклов for, вложенных списочных пониманий или функций, которые загромождают код. Просто чистый, выразительный, питонический дзен .
Это решение позволяет вам иметь собственный список, exts
который может быть изменен без обновления вашего кода. (Это всегда хорошая практика!)
Понимание списка такое же, как и в решении Лорана (за которое я проголосовал). Но я бы сказал, что обычно нет необходимости выделять одну строку в отдельную функцию, поэтому я предоставляю это в качестве альтернативного решения.
Бонус:
Если вам нужен поиск не только по одному каталогу, но и по всем подкаталогам, вы можете передать recursive=True
и использовать глобальный символ **
1 :
files = [f for ext in exts
for f in glob.glob(os.path.join(project_dir, '**', ext), recursive=True)]
Это будет вызывать glob.glob('<project_dir>/**/*.txt', recursive=True)
и так далее для каждого расширения.
1 Технически **
символ глобуса просто соответствует одному или нескольким символам, включая косую черту /
(в отличие от *
символа глобуса в единственном числе ). На практике вам просто нужно помнить, что до тех пор, пока вы окружаете **
косыми чертами (разделителями пути), он соответствует нулю или большему количеству каталогов.