pathlib.Path.info: cache de metadados de arquivos

Publicado em: 01/10/2026
Tempo de leitura: 7 minutos
Estrutura de arquivos e código para pathlib.Path.info no Python

pathlib.Path.info no Python oferece uma forma eficiente de consultar informações sobre um caminho, como saber se ele representa um arquivo, diretório, link simbólico ou outro tipo de entrada. O recurso é especialmente útil em varreduras de diretórios, indexadores, ferramentas de backup, analisadores de projetos, pipelines de dados e aplicações que precisam classificar muitos caminhos sem repetir chamadas caras ao sistema operacional.

A principal ideia é simples: em vez de perguntar várias vezes ao sistema se um caminho é arquivo, diretório ou link, você pode usar um objeto de informações associado ao Path. Quando esse objeto já possui dados obtidos durante uma iteração, ele pode reaproveitá-los e reduzir trabalho desnecessário. Isso torna o código mais claro e, em cenários com muitos arquivos, potencialmente mais rápido.

O que é pathlib.Path.info

Path.info representa um conjunto de consultas sobre o tipo e a existência de um caminho. Ele foi pensado para trabalhar de forma integrada com objetos pathlib.Path, mantendo a API orientada a objetos da biblioteca padrão. Em vez de combinar chamadas soltas de os.path, os.stat e verificações manuais, você centraliza a lógica em um objeto ligado ao caminho.

O valor real aparece quando você percorre um diretório. Em muitas plataformas, a iteração já recebe do sistema operacional metadados básicos sobre cada entrada. O Python pode aproveitar essas informações e evitar uma nova consulta para cada teste de tipo. Isso não elimina todas as chamadas de sistema, mas reduz repetições quando os dados já estão disponíveis.

Exemplo básico

from pathlib import Path

caminho = Path("dados/relatorio.csv")

if caminho.info.exists():
    if caminho.info.is_file():
        print("É um arquivo")
    elif caminho.info.is_dir():
        print("É um diretório")

O exemplo consulta a existência e o tipo do caminho por meio de info. A sintaxe deixa explícito que você está perguntando sobre metadados do objeto. Para operações que realmente precisam abrir, ler ou escrever o arquivo, continue usando os métodos normais de Path.

Usando com iteração de diretórios

from pathlib import Path

raiz = Path("projeto")

for item in raiz.iterdir():
    if item.info.is_dir():
        print("Diretório:", item.name)
    elif item.info.is_file():
        print("Arquivo:", item.name)
    elif item.info.is_symlink():
        print("Link simbólico:", item.name)

Esse é um dos cenários mais naturais para Path.info. Ao percorrer centenas ou milhares de entradas, a diferença entre reutilizar informações e executar uma consulta completa para cada teste pode ser relevante, principalmente em discos de rede, volumes lentos, contêineres ou sistemas com alta latência.

Cache e validade das informações

As informações podem ser armazenadas em cache. Isso significa que uma resposta obtida anteriormente pode continuar sendo usada mesmo que o sistema de arquivos tenha mudado depois. Se outro processo criar, remover ou substituir o arquivo, o objeto já existente pode manter uma visão antiga.

Por isso, trate Path.info como uma fotografia conveniente do estado conhecido, não como uma garantia permanente. Quando você precisa confirmar o estado atual antes de uma operação crítica, crie um novo objeto Path ou use uma consulta que force uma nova leitura conforme a API disponível na versão utilizada.

from pathlib import Path

original = Path("entrada.txt")
print(original.info.exists())

# Depois de uma alteração externa, crie um novo Path
atualizado = Path(original)
print(atualizado.info.exists())

Essa distinção é importante em watchers, filas de processamento, sistemas de upload e tarefas concorrentes. Entre a verificação e a operação, o estado pode mudar. Esse fenômeno é conhecido como condição de corrida do tipo TOCTOU: time of check to time of use.

Não confunda verificação com autorização

Saber que um caminho existe ou é arquivo não significa que você possui permissão para abri-lo. O arquivo pode ser removido, ter suas permissões alteradas ou apontar para outro destino antes da leitura. Portanto, o código deve tratar exceções na operação real.

from pathlib import Path

arquivo = Path("config.toml")

if arquivo.info.is_file():
    try:
        conteudo = arquivo.read_text(encoding="utf-8")
    except OSError as erro:
        print("Não foi possível ler:", erro)

Essa prática evita depender apenas de verificações prévias. Em programas robustos, a tentativa de uso é a confirmação final.

Links simbólicos exigem atenção porque há duas perguntas diferentes: o caminho é um link e o destino do link é arquivo ou diretório? Dependendo do método usado, a consulta pode seguir o link ou examinar o próprio link. Leia a documentação da versão do Python que você utiliza e teste o comportamento desejado.

Em ferramentas de backup, sincronização e remoção, seguir links automaticamente pode causar problemas. Um link dentro de uma pasta pode apontar para fora da árvore esperada. Defina uma política explícita: ignorar links, copiar o link, ou seguir apenas quando o destino estiver dentro de uma raiz confiável.

Exemplo de inventário

from pathlib import Path


def inventariar(raiz: Path) -> dict[str, int]:
    totais = {
        "arquivos": 0,
        "diretorios": 0,
        "links": 0,
        "outros": 0,
    }

    for item in raiz.iterdir():
        if item.info.is_symlink():
            totais["links"] += 1
        elif item.info.is_file():
            totais["arquivos"] += 1
        elif item.info.is_dir():
            totais["diretorios"] += 1
        else:
            totais["outros"] += 1

    return totais

print(inventariar(Path("projeto")))

A função classifica apenas o primeiro nível. Para percorrer subdiretórios, você pode usar uma pilha, uma fila ou métodos recursivos. Em árvores muito grandes, prefira uma abordagem iterativa para controlar memória e profundidade.

Varredura recursiva segura

from pathlib import Path


def listar_arquivos(raiz: Path):
    pendentes = [raiz]

    while pendentes:
        atual = pendentes.pop()

        try:
            itens = list(atual.iterdir())
        except OSError:
            continue

        for item in itens:
            if item.info.is_symlink():
                continue
            if item.info.is_dir():
                pendentes.append(item)
            elif item.info.is_file():
                yield item

O exemplo evita seguir links e trata diretórios inacessíveis. Em aplicações reais, registre os erros, aplique limites e considere cancelamento. Um diretório pode conter milhões de entradas, e converter toda a iteração em lista pode consumir memória. Quando possível, processe cada entrada diretamente.

Desempenho e benchmarking

Não presuma que a otimização terá o mesmo efeito em todas as plataformas. Sistemas operacionais, formatos de disco, caches do kernel e implementações de diretório variam. Meça com dados semelhantes aos de produção.

from pathlib import Path
from time import perf_counter

raiz = Path("dataset")

inicio = perf_counter()
quantidade = sum(1 for p in raiz.iterdir() if p.info.is_file())
fim = perf_counter()

print(quantidade, fim - inicio)

Execute várias vezes, descarte aquecimentos e compare com uma versão equivalente. Um benchmark isolado em poucos arquivos pode medir mais ruído do que a diferença real.

Compatibilidade entre versões

Path.info é um recurso recente. Antes de usá-lo em uma biblioteca, confira a versão mínima do Python. Se o projeto precisa funcionar em versões anteriores, crie uma função compatível.

from pathlib import Path


def eh_arquivo(caminho: Path) -> bool:
    info = getattr(caminho, "info", None)
    if info is not None:
        return info.is_file()
    return caminho.is_file()

Essa estratégia mantém um único ponto de compatibilidade. Documente a versão mínima no pyproject.toml e teste a matriz no CI.

Integração com padrões de caminho

Você pode combinar a classificação com glob, rglob e filtros de nome. Para conhecer melhor essas ferramentas, consulte o artigo sobre pathlib no Python, o guia de glob no Python, o conteúdo sobre módulo os e o artigo de tratamento de erros.

from pathlib import Path

for item in Path("logs").glob("*.log"):
    if item.info.is_file():
        print(item)

O filtro por padrão reduz o conjunto analisado, mas não substitui a validação do tipo. Um nome terminado em .log ainda pode representar um link, diretório ou entrada especial.

Arquivos especiais

Em sistemas Unix, um caminho pode apontar para socket, FIFO, dispositivo de bloco ou dispositivo de caractere. Se sua aplicação espera apenas arquivos regulares, rejeite explicitamente outros tipos. Isso é importante em ferramentas que aceitam caminhos fornecidos pelo usuário.

Não abra indiscriminadamente entradas especiais. Ler um FIFO pode bloquear; acessar um dispositivo pode exigir privilégios; e um socket não deve ser tratado como arquivo comum.

Segurança com caminhos fornecidos pelo usuário

Path.info não impede path traversal. Antes de acessar arquivos recebidos por URL, formulário ou API, resolva a raiz permitida e confirme que o destino permanece dentro dela. Também evite confiar apenas em extensão.

from pathlib import Path

RAIZ = Path("uploads").resolve()


def caminho_seguro(nome: str) -> Path:
    destino = (RAIZ / nome).resolve()
    if RAIZ not in destino.parents and destino != RAIZ:
        raise ValueError("Caminho fora da raiz permitida")
    return destino

Depois da validação, ainda trate erros na abertura. Consulte a documentação oficial de pathlib e a referência de os para detalhes da plataforma.

Quando usar Path.info

Use quando você precisa classificar muitas entradas, especialmente após iterar diretórios. Também é adequado para gerar inventários, selecionar arquivos para processamento, ignorar diretórios, separar links e reduzir consultas repetidas.

Para uma única verificação simples, Path.is_file() ou Path.is_dir() continuam claros e suficientes. A escolha deve considerar legibilidade, compatibilidade e o perfil real de desempenho.

Erros comuns

Os erros mais comuns são confiar indefinidamente no cache, esquecer que o arquivo pode mudar após a verificação, seguir links sem política, ignorar exceções, assumir disponibilidade em versões antigas e usar benchmarks artificiais. Outro erro é tentar usar metadados como garantia de segurança.

Organize a lógica em funções pequenas. Uma função valida a raiz, outra classifica o tipo, outra executa a operação e trata falhas. Isso facilita testes e reduz decisões implícitas.

Conclusão

pathlib.Path.info melhora a classificação de caminhos ao reunir consultas de tipo e aproveitar informações já obtidas durante a iteração. Ele pode tornar varreduras mais eficientes e o código mais expressivo. Porém, o cache exige cuidado: sistemas de arquivos mudam, permissões variam e links podem apontar para locais inesperados. Combine o recurso com tratamento de exceções, validação de caminhos, política explícita de links, testes de compatibilidade e benchmarks realistas. Assim, você obtém desempenho sem comprometer correção e segurança.

Compartilhe:

Facebook
WhatsApp
Twitter
LinkedIn

Conteúdo do artigo

    Artigos relacionados

    Notebook com material de testes em Python para loop_factory e asyncio
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    loop_factory: isole event loops em testes asyncio

    Aprenda loop_factory em IsolatedAsyncioTestCase para criar testes asyncio isolados, previsíveis e sem tarefas pendentes.

    Ler mais

    Tempo de leitura: 5 minutos
    30/09/2026
    Desenvolvedora navegando em arquivos ZIP com zipfile.Path no Python
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    zipfile.Path: navegue em ZIPs sem extrair arquivos

    Aprenda zipfile.Path no Python para navegar, ler e validar arquivos dentro de ZIPs sem extrair tudo.

    Ler mais

    Tempo de leitura: 5 minutos
    30/09/2026
    Programador trabalhando com cabeçalhos de e-mail no Python
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    email.headerregistry: cabeçalhos de e-mail seguros

    Aprenda email.headerregistry no Python para criar e analisar cabeçalhos, endereços, grupos, datas e parâmetros com segurança.

    Ler mais

    Tempo de leitura: 5 minutos
    29/09/2026
    Terminal de computador usado para criar pseudoterminais com os.unlockpt no Python
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    os.unlockpt: controle pseudoterminais no Python

    Aprenda os.unlockpt no Python para criar pseudoterminais, controlar subprocessos interativos e evitar erros de descritores.

    Ler mais

    Tempo de leitura: 6 minutos
    29/09/2026
    Código Python para gerenciamento de filas e threads com queue.ShutDown
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    queue.ShutDown: encerre filas e workers com segurança

    Aprenda queue.ShutDown no Python para encerrar filas com threads, liberar workers e evitar deadlocks.

    Ler mais

    Tempo de leitura: 6 minutos
    28/09/2026
    Código Python representando filtros de valores None com operator.is_none
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    operator.is_none: filtre None em pipelines Python

    Aprenda operator.is_none no Python para filtrar valores None sem remover zeros, False ou strings vazias.

    Ler mais

    Tempo de leitura: 5 minutos
    28/09/2026