İşte Pat'ın cevabının (ayrıca belirli bir proje dizininde zorlamak istediğinizi içeren) tek satırlık bir liste anlama varyantı:
import os, glob
exts = ['*.txt', '*.mdown', '*.markdown']
files = [f for ext in exts for f in glob.glob(os.path.join(project_dir, ext))]
Uzantıların ( for ext in exts
) üzerine döngü yaparsınız ve her uzantı için glob kalıbıyla ( for f in glob.glob(os.path.join(project_dir, ext)
) eşleşen her dosyayı alırsınız .
Bu çözüm kısadır ve gereksiz for-döngüler, iç içe liste kavrayışları veya kodun dağınıklığı için işlevler içermez. Sadece saf, etkileyici, pitonik Zen .
Bu çözüm, exts
kodunuzu güncellemek zorunda kalmadan değiştirebileceğiniz özel bir listeye sahip olmanızı sağlar. (Bu her zaman iyi bir uygulamadır!)
Liste anlama, Laurent'in çözümünde kullanılanla aynıdır (buna oy verdim). Ancak, tek bir satırı ayrı bir işleve ayırmanın genellikle gereksiz olduğunu savunuyorum, bu yüzden bunu alternatif bir çözüm olarak sağlıyorum.
Bonus:
Yalnızca tek bir dizinde değil, tüm alt dizinlerde de arama yapmanız gerekiyorsa recursive=True
, çok dizinli glob sembolünü **
1 geçebilir ve kullanabilirsiniz :
files = [f for ext in exts
for f in glob.glob(os.path.join(project_dir, '**', ext), recursive=True)]
Bu, glob.glob('<project_dir>/**/*.txt', recursive=True)
her uzantı için çağrılacaktır.
1 Teknik olarak, **
glob sembolü , eğik çizgi /
(tekil *
glob sembolünün aksine) dahil olmak üzere bir veya daha fazla karakterle eşleşir . Pratikte, sadece **
eğik çizgilerle (yol ayırıcılar) çevrelediğiniz sürece , sıfır veya daha fazla dizinle eşleştiğini hatırlamanız gerekir .