Python 3.5 ou superior
Como você está em um novo python, use pathlib.Path.rglob
o pathlib
módulo
from pathlib import Path
for path in Path('src').rglob('*.c'):
print(path.name)
Se você não quiser usar o pathlib, use glob.glob
, mas não esqueça de passar o recursive
parâmetro keyword.
Para casos em que arquivos correspondentes começam com um ponto (.); como arquivos no diretório atual ou arquivos ocultos no sistema baseado em Unix, use a os.walk
solução abaixo.
Versões anteriores do Python
Para versões mais antigas do Python, use os.walk
para percorrer recursivamente um diretório e fnmatch.filter
comparar com uma expressão simples:
import fnmatch
import os
matches = []
for root, dirnames, filenames in os.walk('src'):
for filename in fnmatch.filter(filenames, '*.c'):
matches.append(os.path.join(root, filename))
os.path.walk()
que é um pouco mais complicadas de usar do queos.walk()
os.path.walk()
é obsoleto e foi removido em Python 3.pathlib.Path('src').glob('**/*.c')
deve funcionar.Semelhante a outras soluções, mas usando fnmatch.fnmatch em vez de glob, pois o os.walk já listou os nomes de arquivo:
Além disso, o uso de um gerador permite processar cada arquivo conforme ele é encontrado, em vez de encontrar todos os arquivos e processá-los.
fonte
reduce(lambda x, y: x+y, map(lambda (r,_,x):map(lambda f: r+'/'+f, filter(lambda f: fnmatch.fnmatch(f, pattern), x)), os.walk('src/webapp/test_scripts')))
(os.path.join(root,filename) for root, dirs, files in os.walk(directory) for filename in files if fnmatch.fnmatch(filename, pattern))
Modifiquei o módulo glob para oferecer suporte a ** para globbing recursivo, por exemplo:
https://github.com/miracle2k/python-glob2/
Útil quando você deseja fornecer a seus usuários a capacidade de usar a sintaxe ** e, portanto, os.walk () por si só não é bom o suficiente.
fonte
**
o módulo glob oficial, faça:glob(path, recursive=True)
A partir do Python 3.4, é possível usar o
glob()
método de uma dasPath
classes no novo módulo pathlib , que suporta**
curingas. Por exemplo:Atualização: A partir do Python 3.5, a mesma sintaxe também é suportada por
glob.glob()
.fonte
fnmatch
fornece exatamente os mesmos padrões deglob
, portanto, esse é realmente um excelente substituto paraglob.glob
a semântica muito próxima. Uma versão iterativa (por exemplo, um gerador), substituída por IOWglob.iglob
, é uma adaptação trivial (apenasyield
os resultados intermediários à medida que você avança, em vez deextend
uma única lista de resultados para retornar no final).fonte
recursive_glob(pattern, treeroot='.')
como sugeri na minha edição? Dessa forma, pode ser chamado, por exemplo, comorecursive_glob('*.txt')
e intuitivamente corresponde à sintaxe deglob
.fnmatch.filter
, o que é aproximadamente tão útil quanto a possibilidade de correspondência de argumento únicoglob.glob
.Para python> = 3,5 você pode usar
**
,recursive=True
:Demo
fonte
Você deseja usar
os.walk
para coletar nomes de arquivos que correspondem aos seus critérios. Por exemplo:fonte
Aqui está uma solução com compreensão de lista aninhada
os.walk
e correspondência simples de sufixo em vez deglob
:Pode ser compactado em uma linha:
ou generalizada como uma função:
Se você precisa de
glob
padrões de estilo completos , pode seguir o exemplo de Alex e Bruno e usarfnmatch
:fonte
Recentemente tive que recuperar minhas fotos com a extensão .jpg. Eu executei o photorec e recuperei 4579 diretórios em 2,2 milhões de arquivos, com uma enorme variedade de extensões. Com o script abaixo, eu fui capaz de selecionar 50133 arquivos com a extensão .jpg em questão de minutos:
fonte
Considere
pathlib.rglob()
.Veja também @ relacionado de taleinat pós aqui e um semelhante pós em outro lugar.
fonte
Johan e Bruno fornecem excelentes soluções para os requisitos mínimos, conforme indicado. Acabo lançado fórmico que implementa Ant conjunto de arquivos e Globs que podem lidar com isso e cenários mais complicados. Uma implementação de sua exigência é:
fonte
com base em outras respostas, esta é minha implementação de trabalho atual, que recupera arquivos xml aninhados em um diretório raiz:
Estou realmente me divertindo com python :)
fonte
Outra maneira de fazer isso usando apenas o módulo glob. Apenas propague o método rglob com um diretório base inicial e um padrão para corresponder e ele retornará uma lista de nomes de arquivos correspondentes.
fonte
Para python 3.5 e posterior
mais você pode precisar
fonte
/**
ele trabalha para mim, assim:file_names_array = glob.glob('src/**/*.c', recursive=True)
Ou com uma compreensão da lista:
fonte
Acabei de fazer isso .. ele irá imprimir arquivos e diretórios de maneira hierárquica
Mas eu não usei fnmatch ou walk
fonte
Aquele usa fnmatch ou expressão regular:
fonte
Além das respostas sugeridas, você pode fazer isso com alguma mágica de geração lenta e compreensão de lista:
Além de caber em uma linha e evitar listas desnecessárias na memória, isso também tem um bom efeito colateral, que você pode usá-lo de maneira semelhante ao operador **, por exemplo, você pode usar
os.path.join(root, 'some/path/*.c')
para obter todos os arquivos .c subdiretórios do src que possuem essa estrutura.fonte
Este é um código que funciona no Python 2.7. Como parte do meu trabalho de devops, fui obrigado a escrever um script que moveria os arquivos de configuração marcados com live-appName.properties para appName.properties. Pode haver outros arquivos de extensão, como o live-appName.xml.
Abaixo está um código funcional para isso, que localiza os arquivos nos diretórios fornecidos (nível aninhado) e depois o renomeia (move) para o nome de arquivo necessário
Esta função é chamada de um script principal
Espero que isso ajude alguém com problemas semelhantes.
fonte
Versão simplificada da resposta de Johan Dahlin, sem fnmatch .
fonte
Aqui está minha solução usando a compreensão de lista para procurar várias extensões de arquivo recursivamente em um diretório e em todos os subdiretórios:
fonte
fonte
Eu modifiquei a resposta principal nesta postagem .. e criei recentemente esse script que percorrerá todos os arquivos em um determinado diretório (searchdir) e os subdiretórios abaixo dele ... e imprime o nome do arquivo, rootdir, data de modificação / criação e Tamanho.
Espero que isso ajude alguém ... e eles podem percorrer o diretório e obter informações sobre o arquivo.
fonte
Aqui está uma solução que corresponderá ao padrão no caminho completo e não apenas no nome do arquivo base.
Ele é usado
fnmatch.translate
para converter um padrão de estilo glob em uma expressão regular, que é comparada com o caminho completo de cada arquivo encontrado ao percorrer o diretório.re.IGNORECASE
é opcional, mas desejável no Windows, pois o próprio sistema de arquivos não diferencia maiúsculas de minúsculas. (Não me preocupei em compilar o regex porque os documentos indicam que ele deve ser armazenado em cache internamente.)fonte
Eu precisava de uma solução para python 2.x que funcionasse rapidamente em diretórios grandes.
Termino com isso:
Observe que você pode precisar de algum tratamento de exceção, caso
ls
não encontre nenhum arquivo correspondente.fonte
ls src/**/*.c
só funciona se a opção globstar estiver ativada (shopt -s globstar
) - veja esta resposta para obter detalhes.