Вот вариант ответа Пэта на одну строку для понимания списка (который также включает в себя то, что вы хотели поместить в определенную директорию проекта):
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 Технически **символ глобуса просто соответствует одному или нескольким символам, включая косую черту / (в отличие от *символа глобуса в единственном числе ). На практике вам просто нужно помнить, что до тех пор, пока вы окружаете **косыми чертами (разделителями пути), он соответствует нулю или большему количеству каталогов.