Ось однолінійний варіант розуміння списку відповіді Пата (який також включає те, що ви хотіли взяти участь у конкретному каталозі проектів):
import os, glob
exts = ['*.txt', '*.mdown', '*.markdown']
files = [f for ext in exts for f in glob.glob(os.path.join(project_dir, ext))]
Ви переходите до розширень ( for ext in exts
), а потім за кожне розширення ви берете кожен файл, що відповідає глобальному шаблону ( for f in glob.glob(os.path.join(project_dir, ext)
).
Це рішення є коротким і без зайвих циклів, вкладених списків або функцій, що захаращують код. Просто чистий, виразний, пітонічний дзен .
Це рішення дозволяє мати спеціальний список, 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 Технічно **
символ глобуса просто відповідає одному або більше символів, включаючи нахил вперед /
(на відміну від сингулярного *
символу глобуса). На практиці вам просто потрібно пам’ятати, що доки ви оточуєте **
косою косою рискою (роздільники контурів), вона відповідає нулю або більше каталогів.