Listando todos os arquivos um diretório (recursivamente), com filtro. (Python)

Neste post estão dois exemplos de como listar os arquivos de um diretório (e seus subdiretórios), aplicando um filtro ao nome do arquivo.

 

Para os dois exemplos, vou utilizar as variáveis abaixo:

base_path = r'c:\dir\with\bunch\of\files'
filename_filter = "*.py"

A variável base_path é a que possui o diretório base que será utilizado na busca dos arquivos e a filename_filter possui o filtro que sera aplicado.

 

Uma observação sobre o filtro: Você pode definir o filtro como “*” e ele vai aceitar qualquer arquivo ou pode utilizar * como wildcards, por exemplo: O filtro “deploy*.y*ml” vai aceitar qualquer arquivo cujo nome comece com deploy e que tenha a extensao .y*ml, onde o * pode ser qualquer caractere.

 

Utilizando Python 3.4+

from pathlib import Path

for filename in Path(base_path).rglob(filename_filter):
    print(filename)

No exemplo acima, a variável filename é um objeto do tipo Path.

Um ponto importante é que a função rglob retorna um generator e não uma lista. Sendo assim, não é possível utilizar funções do tipo len sem antes converter o retorno para lista.

 

 

Utilizando versões antigas do Python

import fnmatch
import os

for root, dirnames, filenames in os.walk(base_path):
    for filename in fnmatch.filter(filenames, filename_filter):
        print(os.path.join(root, filename))

Diferente do metodo utilizado no exemplo anterior, este trabalha apenas com strings e retorna apenas o nome do arquivo, por isso é necessário usar os.path.join(root, filename) para conseguir o caminho completo do arquivo.

 

Ambas abordagens funcionam com caminhos de rede também.

 

Espero ter ajudado.

 

The following two tabs change content below.
Arquiteto de Software e Desenvolvedor Backend (quase Fullstack), geralmente trabalho com C#, PowerShell, Python, Golang, bash e Unity (esse é mais por hobby). Estou sempre buscando algo novo para aprender, adicionando novas ferramentas ao meu cinto de utilidades.
Posted in Dev, Python and tagged , , , , , , .