Aqui está uma variante de compreensão de lista de uma linha da resposta de Pat (que também inclui o que você queria escrever em um diretório específico do projeto):
import os, glob
exts = ['*.txt', '*.mdown', '*.markdown']
files = [f for ext in exts for f in glob.glob(os.path.join(project_dir, ext))]
Você percorre as extensões ( for ext in exts
) e, em seguida, para cada extensão, você pega cada arquivo que corresponde ao padrão glob ( for f in glob.glob(os.path.join(project_dir, ext)
).
Essa solução é curta e sem nenhum loop for desnecessário, compreensão de lista aninhada ou funções para desorganizar o código. Zen puro, expressivo e pitônico .
Esta solução permite que você tenha uma lista personalizada exts
que pode ser alterada sem precisar atualizar seu código. (Essa é sempre uma boa prática!)
A compreensão da lista é a mesma usada na solução de Laurent (na qual votei). Mas eu argumentaria que geralmente não é necessário fatorar uma única linha para uma função separada, e é por isso que estou fornecendo isso como uma solução alternativa.
Bônus:
Se você precisar pesquisar não apenas um único diretório, mas também todos os subdiretórios, poderá passar recursive=True
e usar o símbolo glob de vários diretórios **
1 :
files = [f for ext in exts
for f in glob.glob(os.path.join(project_dir, '**', ext), recursive=True)]
Isso será chamado glob.glob('<project_dir>/**/*.txt', recursive=True)
e assim por diante para cada extensão.
1 Tecnicamente, o **
símbolo da glob simplesmente corresponde a um ou mais caracteres, incluindo barra /
(ao contrário do *
símbolo da glob singular ). Na prática, basta lembrar que, desde que você rodeie **
com barras (separadores de caminho), ele corresponde a zero ou mais diretórios.