以下は、パットの回答の1行のリスト理解バリアントです(これには、特定のプロジェクトディレクトリにグロブしたいことも含まれます)。
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
)をループし、各拡張子について、globパターン(for f in glob.glob(os.path.join(project_dir, ext)
)に一致する各ファイルを取得します。
このソリューションは短く、不要なforループ、ネストされたリスト内包表記、またはコードを乱雑にする関数はありません。純粋で表現力豊かなPythonic Zenです。
このソリューションではexts
、コードを更新しなくても変更可能なカスタムリストを作成できます。(これは常に良い習慣です!)
リスト内包表記は、ローランのソリューションで使用したものと同じです(私が投票しました)。しかし、通常は1行を個別の関数に分解する必要はないと主張します。そのため、これを代替ソリューションとして提供しています。
ボーナス:
単一のディレクトリだけでなくすべてのサブディレクトリも検索する必要がある場合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技術的には、**
グロブ記号は、単一のグロブ記号とは異なり、スラッシュを含む 1つ以上の文字に一致します。実際には、スラッシュ(パス区切り文字)で囲まれている限り、0個以上のディレクトリと一致することを覚えておく必要があります。/
*
**