Berikut adalah varian pemahaman daftar satu baris dari jawaban Pat (yang juga termasuk yang Anda ingin gabungkan dalam direktori proyek tertentu):
import os, glob
exts = ['*.txt', '*.mdown', '*.markdown']
files = [f for ext in exts for f in glob.glob(os.path.join(project_dir, ext))]
Anda mengulang ekstensi ( for ext in exts
), dan kemudian untuk setiap ekstensi Anda mengambil setiap file yang cocok dengan pola glob ( for f in glob.glob(os.path.join(project_dir, ext)
).
Solusi ini singkat , dan tanpa loop-for yang tidak perlu, pemahaman daftar bersarang, atau fungsi untuk mengacaukan kode. Zen yang murni, ekspresif, dan pythonic .
Solusi ini memungkinkan Anda memiliki daftar kustom exts
yang dapat diubah tanpa harus memperbarui kode Anda. (Ini selalu merupakan praktik yang baik!)
Pemahaman daftar sama dengan yang digunakan dalam solusi Laurent (yang saya pilih). Tetapi saya berpendapat bahwa biasanya tidak perlu memfaktorkan satu baris ke fungsi terpisah, itulah sebabnya saya memberikan ini sebagai solusi alternatif.
Bonus:
Jika Anda tidak hanya perlu mencari satu direktori, tetapi juga semua sub-direktori, Anda dapat meneruskan recursive=True
dan menggunakan simbol glob multi-direktori **
1 :
files = [f for ext in exts
for f in glob.glob(os.path.join(project_dir, '**', ext), recursive=True)]
Ini akan memanggil glob.glob('<project_dir>/**/*.txt', recursive=True)
dan seterusnya untuk setiap ekstensi.
1 Secara teknis, **
simbol bola hanya cocok dengan satu atau lebih karakter termasuk garis miring /
(tidak seperti simbol bola tunggal *
). Dalam praktiknya, Anda hanya perlu mengingat bahwa selama Anda mengapit **
garis miring ke depan (pemisah jalur), itu cocok dengan nol atau lebih direktori.