Quero abrir uma série de subpastas em uma pasta e encontrar alguns arquivos de texto e imprimir algumas linhas dos arquivos de texto. Estou usando este:
configfiles = glob.glob('C:/Users/sam/Desktop/file1/*.txt')
Mas isso não pode acessar as subpastas também. Alguém sabe como posso usar o mesmo comando para acessar subpastas também?
python
filesystems
glob
fnmatch
UserYmY
fonte
fonte
Respostas:
No Python 3.5 e mais recente, use a nova
**/
funcionalidade recursiva :Quando
recursive
é definido,**
seguido por um separador de caminho corresponde a 0 ou mais subdiretórios.Em versões anteriores do Python,
glob.glob()
não é possível listar arquivos em subdiretórios recursivamente.Nesse caso, eu usaria
os.walk()
combinado comfnmatch.filter()
:Isso percorrerá seus diretórios recursivamente e retornará todos os nomes de caminho absolutos aos
.txt
arquivos correspondentes . Neste caso específico ,fnmatch.filter()
pode ser um exagero, você também pode usar um.endswith()
teste:fonte
path to directory
.recursive=False
junto com a**/
funcionalidade não fornece a lista de arquivos apenas na pasta dada, mas em seus filhos?**/
fornece uma lista de nomes de diretório no diretório de trabalho atual, porque o padrão termina em/
, e comrecursive=False
você basicamente tem um duplo*
, correspondendo exatamente como*/
, apenas menos eficiente.*/*
se precisar de todos os arquivos em todos os subdiretórios.Para localizar arquivos em subdiretórios imediatos:
Para uma versão recursiva que atravessa todos os subdiretórios, você pode usar
**
e passarrecursive=True
desde Python 3.5 :Ambas as funções chamam listas de retorno. Você pode usar
glob.iglob()
para retornar caminhos um por um. Ou usepathlib
:Ambos os métodos retornam iteradores (você pode obter caminhos um por um).
fonte
glob()
oferecer suporte a padrões em diretórios.**
caso de recursão. Mas para**
funcionar, você tem que definir arecursion=True
chave, aliás.Há muita confusão neste tópico. Deixe-me ver se consigo esclarecer (Python 3.7):
glob.glob('*.txt') :
corresponde a todos os arquivos que terminam em '.txt' no diretório atualglob.glob('*/*.txt') :
igual a 1glob.glob('**/*.txt') :
corresponde a todos os arquivos que terminam em '.txt' apenas nos subdiretórios imediatos , mas não no diretório atualglob.glob('*.txt',recursive=True) :
igual a 1glob.glob('*/*.txt',recursive=True) :
igual a 3glob.glob('**/*.txt',recursive=True):
corresponde a todos os arquivos que terminam em '.txt' no diretório atual e em todos os subdiretóriosPortanto, é melhor sempre especificar
recursive=True.
fonte
O pacote glob2 suporta curingas e é razoavelmente rápido
No meu laptop, leva aproximadamente 2 segundos para corresponder a > 60.000 caminhos de arquivo .
fonte
Você pode usar Formic com Python 2.6
Divulgação - eu sou o autor deste pacote.
fonte
Aqui está uma versão adaptada que permite a
glob.glob
funcionalidade semelhante sem usarglob2
.Então, se você tiver a seguinte estrutura de dir
Você pode fazer algo assim
Praticamente a
fnmatch
correspondência de padrão no nome do arquivo inteiro, em vez de apenas no nome do arquivo.fonte
configfiles = glob.glob('C:/Users/sam/Desktop/**/*.txt")
Não funciona para todos os casos, em vez disso, use glob2
fonte
Se você pode instalar o pacote glob2 ...
Todos os nomes de arquivos e pastas:
fonte
Se você estiver executando o Python 3.4+, pode usar o
pathlib
módulo. OPath.glob()
método suporta o**
padrão, que significa “este diretório e todos os subdiretórios, recursivamente”. Ele retorna um gerador que produzPath
objetos para todos os arquivos correspondentes.fonte
Conforme apontado por Martijn, glob só pode fazer isso por meio do
**
operador introduzido no Python 3.5. Como o OP pediu explicitamente o módulo glob, o seguinte retornará um iterador de avaliação preguiçoso que se comporta de maneira semelhanteObserve que você só pode iterar uma vez
configfiles
nesta abordagem. Se você precisar de uma lista real de configfiles que podem ser usados em várias operações, você terá que criá-la explicitamente usandolist(configfiles)
.fonte
O comando
rglob
fará uma recursão infinita no subnível mais profundo de sua estrutura de diretório. Se você deseja apenas um nível de profundidade, não o use.Percebo que o OP estava falando sobre o uso de glob.glob. Acredito que isso atenda à intenção, no entanto, que é pesquisar todas as subpastas recursivamente.
A
rglob
função recentemente produziu um aumento de 100x na velocidade de um algoritmo de processamento de dados que estava usando a estrutura de pastas como uma suposição fixa para a ordem de leitura dos dados. No entanto,rglob
conseguimos fazer uma única varredura em todos os arquivos em ou abaixo de um diretório pai especificado, salvar seus nomes em uma lista (mais de um milhão de arquivos) e, em seguida, usar essa lista para determinar quais arquivos precisávamos abrir em qualquer apontar no futuro com base nas convenções de nomenclatura de arquivo apenas em relação à pasta em que eles estavam.fonte