stat no Python: tipos e permissões

Publicado em: 10/08/2026
Tempo de leitura: 5 minutos
Pasta com cadeado representando tipos e permissões com stat no Python

O módulo stat da biblioteca padrão ajuda a interpretar os metadados retornados por os.stat(), os.fstat() e os.lstat(). Esses dados incluem tipo do objeto, permissões, proprietário, tamanho, número de links, dispositivo, inode e horários. O módulo é especialmente útil quando uma aplicação precisa analisar vários atributos sem repetir chamadas ao sistema.

Este guia mostra como reconhecer arquivos, diretórios, links e objetos especiais; extrair bits de permissão; exibir modos legíveis; entender diferenças entre plataformas; e evitar problemas de segurança como condições de corrida e seguimento indevido de links simbólicos.

Obter metadados com os.stat

import os

info = os.stat("dados.txt")
print(info.st_size)
print(info.st_mtime)
print(info.st_mode)

O resultado é um objeto semelhante a uma tupla, mas com atributos nomeados. Prefira esses atributos em vez dos índices históricos como ST_SIZE, pois o código fica mais claro.

Identificar o tipo do arquivo

O campo st_mode combina o tipo do objeto com bits de permissão. As funções S_ISREG(), S_ISDIR(), S_ISLNK(), S_ISSOCK(), S_ISFIFO(), S_ISCHR() e S_ISBLK() testam tipos específicos.

import os
import stat

modo = os.lstat("atalho").st_mode

if stat.S_ISLNK(modo):
    print("link simbólico")
elif stat.S_ISDIR(modo):
    print("diretório")
elif stat.S_ISREG(modo):
    print("arquivo comum")

Use lstat() quando precisar examinar o próprio link. stat() normalmente segue o link e retorna informações do destino.

Evitar chamadas repetidas

Funções como os.path.isfile() e os.path.isdir() são convenientes, mas cada teste pode exigir uma nova consulta ao sistema. Quando você já chamou os.stat(), reutilize st_mode com o módulo stat.

info = os.stat(caminho)
modo = info.st_mode

regular = stat.S_ISREG(modo)
diretorio = stat.S_ISDIR(modo)
permissoes = stat.S_IMODE(modo)

Essa abordagem é útil em indexadores, scanners, backups e inventários que processam milhares de entradas.

Exibir permissões de forma legível

stat.filemode() converte o modo para uma representação semelhante à exibida por ls -l, como -rw-r--r-- ou drwxr-xr-x.

import os
import stat

info = os.stat("dados.txt")
print(stat.filemode(info.st_mode))

O primeiro caractere descreve o tipo; os nove seguintes representam leitura, escrita e execução para proprietário, grupo e outros. Essa string é ótima para logs e interfaces, mas decisões de acesso devem usar bits e APIs reais.

Extrair apenas os bits configuráveis

S_IMODE() remove a parte que identifica o tipo e mantém permissões, sticky bit, setuid e setgid.

modo_atual = os.stat("script.sh").st_mode
permissoes = stat.S_IMODE(modo_atual)
print(oct(permissoes))

Ao modificar permissões com os.chmod(), trabalhe com máscaras explícitas. Evite copiar cegamente modos de arquivos não confiáveis, principalmente bits especiais.

Bits de proprietário, grupo e outros

O módulo define constantes como S_IRUSR, S_IWUSR, S_IXUSR, S_IRGRP, S_IWGRP, S_IXGRP, S_IROTH, S_IWOTH e S_IXOTH.

modo = os.stat("arquivo.txt").st_mode

if modo & stat.S_IWOTH:
    print("gravável por outros")
if modo & stat.S_IXUSR:
    print("executável pelo proprietário")

Esses bits descrevem a configuração do arquivo, não garantem que o processo atual consiga acessá-lo. ACLs, privilégios, montagem somente leitura e políticas de segurança também influenciam.

Sticky, setuid e setgid

S_ISVTX representa o sticky bit; em diretórios como /tmp, ele restringe remoção e renomeação. S_ISUID e S_ISGID têm significados especiais em Unix.

Ferramentas de auditoria podem sinalizar esses bits, mas não devem alterá-los automaticamente sem uma política explícita. Uma correção ingênua pode quebrar software ou criar vulnerabilidades.

Tamanho nem sempre significa bytes de arquivo comum

Para arquivos regulares, st_size representa bytes. Para FIFOs e sockets em alguns sistemas Unix, pode indicar bytes aguardando leitura. Em dispositivos, o significado varia.

Antes de usar st_size para alocar memória ou validar uploads, confirme que S_ISREG(st_mode) é verdadeiro e imponha limites independentes.

Entender atime, mtime e ctime

st_atime é o último acesso, st_mtime é a última modificação do conteúdo e st_ctime depende da plataforma. Em Unix, ctime costuma indicar alteração de metadados; no Windows, tradicionalmente representa criação.

Não use ctime como “data de criação” em código portátil. Sistemas de arquivos, opções de montagem e precisão dos timestamps podem variar. Para comparações precisas, prefira as versões em nanossegundos, como st_mtime_ns.

st_ino e st_dev ajudam a identificar um objeto em sistemas compatíveis. st_nlink informa quantos links físicos apontam para o inode.

info = os.stat("dados.txt")
identidade = (info.st_dev, info.st_ino)
print(identidade, info.st_nlink)

Esse par pode ajudar a detectar duplicatas durante uma varredura, mas não deve ser persistido como identificador global permanente. Inodes podem ser reutilizados.

Há uma janela entre verificar um caminho e usá-lo. Outro processo pode substituir o arquivo após a validação, criando uma condição TOCTOU. Em operações sensíveis, prefira APIs que trabalham com descritores, opções dir_fd, follow_symlinks=False ou abertura segura oferecida pelo sistema.

Também valide a raiz permitida e evite confiar apenas em extensão, nome ou resultado de um teste anterior.

Flags de BSD e macOS

O módulo expõe flags como UF_IMMUTABLE, UF_APPEND, UF_HIDDEN e diversas constantes SF_* em plataformas compatíveis. Python 3.13 ampliou algumas dessas definições.

Teste disponibilidade com hasattr(stat, "UF_IMMUTABLE"). Não suponha que uma constante existente tenha efeito idêntico em todos os sistemas.

Atributos de arquivos no Windows

No Windows, os.stat() pode fornecer st_file_attributes e st_reparse_tag. O módulo oferece constantes como FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_READONLY, FILE_ATTRIBUTE_REPARSE_POINT e tags conhecidas para links e pontos de montagem.

info = os.stat(caminho, follow_symlinks=False)
atributos = getattr(info, "st_file_attributes", 0)

if atributos & stat.FILE_ATTRIBUTE_HIDDEN:
    print("oculto no Windows")

Use getattr() para manter portabilidade.

Exemplo de inventário seguro

from pathlib import Path
import os
import stat


def descrever(caminho: Path):
    info = os.lstat(caminho)
    modo = info.st_mode
    if stat.S_ISLNK(modo):
        tipo = "link"
    elif stat.S_ISDIR(modo):
        tipo = "diretorio"
    elif stat.S_ISREG(modo):
        tipo = "arquivo"
    else:
        tipo = "especial"
    return {
        "nome": caminho.name,
        "tipo": tipo,
        "modo": stat.filemode(modo),
        "tamanho": info.st_size,
        "mtime_ns": info.st_mtime_ns,
    }

O exemplo usa lstat() para não seguir links e retorna dados adequados a relatórios. A aplicação ainda deve tratar erros de permissão, arquivos removidos durante a leitura e limites de diretório.

Erros frequentes

  • Interpretar st_ctime como criação em todas as plataformas.
  • Usar stat() quando queria inspecionar o link.
  • Confiar em st_size sem verificar o tipo.
  • Tratar bits de modo como autorização completa.
  • Repetir chamadas ao sistema desnecessariamente.
  • Ignorar condições de corrida entre verificação e uso.
  • Assumir que flags específicas existem em qualquer sistema.

Boas práticas

  • Reutilize o resultado de uma única chamada.
  • Use S_IS* para testar tipos.
  • Use S_IMODE() para extrair permissões.
  • Use filemode() somente para apresentação.
  • Prefira timestamps em nanossegundos para comparação.
  • Trate links e caminhos com uma política explícita.
  • Teste comportamento em cada plataforma suportada.

Conteúdos relacionados

Veja os guias sobre filecmp, mmap, platform, sysconfig e fnmatch.

Consulte a documentação oficial do stat e a documentação de os.stat.

Conclusão

O módulo stat transforma modos e atributos de baixo nível em testes legíveis e portáveis. Ele é valioso para auditoria, backups, indexação e ferramentas de sistema, mas deve ser combinado com tratamento de erros, validação de caminhos e APIs resistentes a condições de corrida.

Compartilhe:

Facebook
WhatsApp
Twitter
LinkedIn

Conteúdo do artigo

    Artigos relacionados

    Código assíncrono representando asyncio.eager_task_factory no Python
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    asyncio.eager_task_factory: reduza overhead de tarefas

    Aprenda asyncio.eager_task_factory no Python para reduzir overhead, entender mudanças de ordem e otimizar corrotinas curtas com segurança.

    Ler mais

    Tempo de leitura: 4 minutos
    14/09/2026
    Desenvolvedor trabalhando com timestamps UTC e calendar.timegm no Python
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    calendar.timegm: converta UTC para timestamp Unix

    Aprenda calendar.timegm no Python para converter datas UTC em timestamps Unix com segurança, testes e integração com datetime.

    Ler mais

    Tempo de leitura: 6 minutos
    14/09/2026
    Programador analisando código para identificar tipos MIME de arquivos no Python
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    mimetypes.guess_file_type: detecte tipos MIME

    Aprenda mimetypes.guess_file_type no Python para detectar tipos MIME em caminhos, URLs, uploads e respostas HTTP com fallbacks seguros.

    Ler mais

    Tempo de leitura: 6 minutos
    13/09/2026
    Componentes de servidor representando interpretadores Python executando em paralelo
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    InterpreterPoolExecutor: paralelismo real no Python

    Aprenda InterpreterPoolExecutor no Python para executar tarefas CPU-bound em interpretadores isolados com paralelismo real.

    Ler mais

    Tempo de leitura: 6 minutos
    13/09/2026
    Microprocessador representando CPUs disponíveis para um processo Python
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    os.process_cpu_count: conte CPUs disponíveis

    Aprenda os.process_cpu_count no Python para dimensionar workers conforme as CPUs realmente disponíveis ao processo.

    Ler mais

    Tempo de leitura: 4 minutos
    12/09/2026
    Laptop com código digital representando dados BLOB no SQLite
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    sqlite3.Blob: leia BLOBs sem carregar tudo na memória

    Aprenda sqlite3.Blob no Python para ler e gravar BLOBs em partes, reduzir memória e trabalhar com dados binários no SQLite.

    Ler mais

    Tempo de leitura: 5 minutos
    12/09/2026