Recuperar eficientemente todos os arquivos dentro de um diretório é uma tarefa crucial em vários programas Python, particularmente aqueles que envolvem manipulação de sistema de arquivos, processamento de dados ou automação. O Python fornece vários métodos robustos para alcançar isso, cada um com suas próprias vantagens e desvantagens. Este artigo explora três abordagens populares: os.listdir
, os.walk
e glob.glob
, guiando você na seleção do método mais apropriado para suas necessidades específicas.
Sumário
os.listdir
: Listando Arquivos em um Único Diretórioos.walk
: Travessia Recursiva de Diretóriosglob.glob
: Seleção de Arquivos Baseada em Padrões- Escolhendo o Método Certo
os.listdir
: Listando Arquivos em um Único Diretório
A função os.listdir()
oferece a maneira mais simples de obter uma lista de todas as entradas (arquivos e subdiretórios) dentro de um diretório especificado. Ela retorna uma lista de strings, cada uma representando o nome de um item dentro desse diretório.
import os
def listar_arquivos_diretorio(diretorio):
"""Lista todos os arquivos e diretórios em um diretório dado.
Args:
diretorio: O caminho para o diretório.
Returns:
Uma lista de nomes de arquivos (strings) e nomes de diretórios no diretório especificado.
Retorna uma lista vazia se o diretório estiver vazio ou não existir.
Imprime uma mensagem de erro se o diretório não for encontrado.
"""
try:
return os.listdir(diretorio)
except FileNotFoundError:
print(f"Erro: Diretório '{diretorio}' não encontrado.")
return []
meu_diretorio = "/caminho/para/seu/diretorio" # Substitua pelo caminho do seu diretório
arquivos_e_diretorios = listar_arquivos_diretorio(meu_diretorio)
print(arquivos_e_diretorios)
Vantagens: Simples e eficiente para listagens de diretórios únicos.
Desvantagens: Não percorre recursivamente subdiretórios; fornece apenas nomes de arquivos, não caminhos completos.
os.walk
: Travessia Recursiva de Diretórios
Para explorar recursivamente diretórios e seus subdiretórios, os.walk()
é a escolha ideal. Ele retorna uma 3-tupla para cada diretório: (root, dirs, files)
. root
é o caminho para o diretório atual, dirs
é uma lista de nomes de subdiretórios e files
lista os nomes de arquivos dentro daquele diretório.
import os
def obter_todos_arquivos(diretorio):
"""Recupera recursivamente todos os arquivos dentro de um diretório e seus subdiretórios.
Args:
diretorio: O caminho para o diretório.
Returns:
Uma lista de caminhos completos de arquivos (strings). Retorna uma lista vazia se o diretório estiver vazio ou não existir.
Imprime uma mensagem de erro se o diretório não for encontrado.
"""
todos_arquivos = []
try:
for root, _, files in os.walk(diretorio):
for arquivo in files:
todos_arquivos.append(os.path.join(root, arquivo))
return todos_arquivos
except FileNotFoundError:
print(f"Erro: Diretório '{diretorio}' não encontrado.")
return []
meu_diretorio = "/caminho/para/seu/diretorio" # Substitua pelo caminho do seu diretório
todos_arquivos = obter_todos_arquivos(meu_diretorio)
print(todos_arquivos)
Vantagens: Percorre recursivamente subdiretórios, fornecendo caminhos completos de arquivos.
Desvantagens: Ligeiramente mais complexo que os.listdir()
.
glob.glob
: Seleção de Arquivos Baseada em Padrões
A função glob.glob()
oferece correspondência de nomes de arquivos flexíveis usando curingas no estilo shell. Isso é particularmente útil para selecionar arquivos com base em padrões específicos (por exemplo, todos os arquivos .txt
, arquivos começando com “relatório_”).
import glob
import os
def obter_arquivos_por_padrao(diretorio, padrao="*"):
"""Recupera arquivos que correspondem a um padrão dentro de um diretório.
Args:
diretorio: O caminho para o diretório.
padrao: O padrão do nome do arquivo (o padrão é "*", correspondendo a todos os arquivos).
Returns:
Uma lista de caminhos completos de arquivos (strings) correspondentes ao padrão.
Retorna uma lista vazia se nenhum arquivo corresponder ou o diretório não existir.
Imprime uma mensagem de erro se o diretório não for encontrado.
"""
try:
return glob.glob(os.path.join(diretorio, padrao))
except FileNotFoundError:
print(f"Erro: Diretório '{diretorio}' não encontrado.")
return []
meu_diretorio = "/caminho/para/seu/diretorio" # Substitua pelo caminho do seu diretório
arquivos_txt = obter_arquivos_por_padrao(meu_diretorio, "*.txt")
print(arquivos_txt)
todos_arquivos = obter_arquivos_por_padrao(meu_diretorio)
print(todos_arquivos)
Vantagens: Poderosas capacidades de correspondência de padrões.
Desvantagens: Menos direto que os.listdir()
para listagens simples; não percorre recursivamente subdiretórios a menos que combinado com os.walk()
.
Escolhendo o Método Certo
O método ideal depende de suas necessidades específicas:
- Para listagens simples de um único diretório,
os.listdir()
é suficiente. - Para travessia recursiva de diretórios e subdiretórios,
os.walk()
é a melhor escolha. - Para recuperação seletiva de arquivos usando padrões,
glob.glob()
fornece a solução mais eficiente.
Lembre-se de incorporar tratamento de erros apropriado (por exemplo, FileNotFoundError
) para um código robusto.