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

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

Overview

Se você já se perguntou como poderia listar arquivos em um diretório (e em seus subdiretórios) utilizando Python, então você está no lugar certo! Neste post vamos explorar duas maneiras de fazer justamente isso, com um bônus: a aplicação de filtros nos nomes dos arquivos. Vamos mergulhar em exemplos práticos que servem tanto para usuários da versão moderna quanto para aqueles que utilizam versões mais antigas do Python. Prepare-se para tornar a tarefa de buscar arquivos uma brisa em seu dia a dia de programação!

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.