Existe uma maneira melhor de usar glob.glob em python para obter uma lista de vários tipos de arquivos, como .txt, .mdown e .markdown? Agora eu tenho algo parecido com isto:
projectFiles1 = glob.glob( os.path.join(projectDir, '*.txt') )
projectFiles2 = glob.glob( os.path.join(projectDir, '*.mdown') )
projectFiles3 = glob.glob( os.path.join(projectDir, '*.markdown') )
Respostas:
Talvez exista uma maneira melhor, mas que tal:
Talvez exista outra maneira, então aguarde, caso alguém encontre uma resposta melhor.
fonte
files_grabbed = [glob.glob(e) for e in ['*.pdf', '*.cpp']]
[f for f_ in [glob.glob(e) for e in ('*.jpg', '*.mp4')] for f in f_]
Se você precisar especificar um caminho, faça um loop sobre os padrões de correspondência e mantenha a junção dentro do loop para simplificar:
fonte
glob
retorna uma lista: por que não executá-lo várias vezes e concatenar os resultados?fonte
ProjectFiles
paraprojectFiles
, mas ótima solução.Encadear os resultados:
Então:
fonte
chain.from_iterable
. Portanto, este é semelhante, mas menos legível:it.chain(*(glob.iglob(pattern) for pattern in patterns))
.Tantas respostas que sugerem globbing quantas vezes o número de extensões, preferiria globbing apenas uma vez:
fonte
com glob não é possível. você pode usar apenas:
* corresponde a tudo
? corresponde a qualquer caractere único
[seq] corresponde a qualquer caractere em seq
[! seq] corresponde a qualquer caractere que não esteja em seq
use os.listdir e um regexp para verificar padrões:
fonte
itertools
porque alterações subsequentes nos padrões também precisam ser hacky (digamos que você queira permitir maiúsculas e minúsculas) . Oh, e que poderia ser mais limpo para escrever'.*\.(txt|sql)'
Por exemplo, para
*.mp3
e*.flac
em várias pastas, você pode:A idéia pode ser estendida para mais extensões de arquivo, mas você deve verificar se as combinações não correspondem a nenhuma outra extensão de arquivo indesejada que você possa ter nessas pastas. Portanto, tenha cuidado com isso.
Para combinar automaticamente uma lista arbitrária de extensões em um único padrão glob, você pode fazer o seguinte:
fonte
A one-liner, apenas para o inferno ..
resultado:
fonte
Depois de vir aqui para obter ajuda, fiz minha própria solução e queria compartilhá-la. É baseado na resposta do usuário2363986, mas acho que isso é mais escalável. Ou seja, se você tiver 1000 extensões, o código ainda parecerá um pouco elegante.
fonte
directoryPath = "/Users/bla/bla/images_dir*."
fonte
Enquanto o glob padrão do Python não segue realmente o glob do Bash, você pode fazer isso com outras bibliotecas. Podemos ativar chaves no globo do wcmatch .
Você pode até usar padrões glob estendidos se essa for sua preferência:
fonte
recursive
bandeiraglob.GLOBSTAR
bandeiraEu liberei fórmico que múltiplos implementos inclui de um modo semelhante ao do Apache Ant FileSet e Globs .
A pesquisa pode ser implementada:
Como o Ant glob completo é implementado, você pode incluir diretórios diferentes em cada padrão, para escolher apenas os arquivos .txt em um subdiretório e o .markdown em outro, por exemplo:
Eu espero que isso ajude.
fonte
A função a seguir
_glob
mostra várias extensões de arquivo.fonte
Esta é uma
pathlib
solução Python 3.4+ :Também ignora todos os nomes de arquivos iniciados por
~
.fonte
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):
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 :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.fonte
Não
glob
, mas aqui está outra maneira de usar uma compreensão de lista:fonte
Você pode tentar fazer uma lista manual comparando a extensão existente com as necessárias.
fonte
https://docs.python.org/3.5/library/functools.html#functools.reduce https://docs.python.org/3.5/library/operator.html#operator.add
fonte
Para
glob
vários tipos de arquivo, você precisa chamar aglob()
função várias vezes em um loop. Como essa função retorna uma lista, você precisa concatenar as listas.Por exemplo, esta função faz o trabalho:
Uso simples:
Você também pode usar
glob.iglob()
para ter um iterador:fonte
Use uma lista de extensão e itere através
fonte
Você pode usar o filtro:
fonte
Você também pode usar
reduce()
assim:isso cria uma lista
glob.glob()
para cada padrão e os reduz para uma única lista.fonte
Um globo, muitas extensões ... mas solução imperfeita (pode corresponder a outros arquivos).
fonte
Eu tive o mesmo problema e é isso que eu criei
fonte
Outra solução (use
glob
para obter caminhos usando a correspondência múltiplapatterns
e combinar todos os caminhos em uma única lista usandoreduce
eadd
):fonte
Se você usar,
pathlib
tente o seguinte:fonte
Pelos resultados que obtive de testes empíricos, descobriu-se que essa
glob.glob
não é a melhor maneira de filtrar arquivos por suas extensões. Alguns dos motivos são:Testei (para correção e eficiência no tempo) os seguintes
4
métodos diferentes para filtrar arquivos por extensões e colocá-los emlist
:Ao executar o código acima no meu laptop, obtive os seguintes resultados auto-explicativos.
A maneira mais rápida de filtrar arquivos por extensões, é até a mais feia. Ou seja,
for
loops aninhados estring
comparação usando oendswith()
métodoAlém disso, como você pode ver, os algoritmos de globbing (com o padrão
E:\x\y\z\**/*[py][pyc]
), mesmo com apenas a2
extensão fornecida (py
epyc
), também retornam resultados incorretos.fonte
fonte
Isso deve funcionar:
fonte
Por exemplo:
Uma função:
fonte