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

    Notebook com código representando documentação automática com pydoc no Python
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    pydoc no Python: documentação automática

    Aprenda pydoc no Python para gerar ajuda no terminal, HTML e servidor local a partir de docstrings, com segurança ao

    Ler mais

    Tempo de leitura: 7 minutos
    10/08/2026
    Teclado internacional representando números, moedas e datas com locale no Python
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    locale no Python: números, moedas e datas

    Aprenda locale no Python para formatar e interpretar números, moedas, datas e ordenação cultural sem erros de concorrência.

    Ler mais

    Tempo de leitura: 8 minutos
    09/08/2026
    Monitor e rede representando informações de sistema com platform no Python
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    platform no Python: informações do sistema

    Aprenda platform no Python para identificar sistema operacional, arquitetura, distribuição, versão do Python e ambiente com segurança.

    Ler mais

    Tempo de leitura: 7 minutos
    09/08/2026
    Código e compilador representando caminhos e variáveis de build com sysconfig no Python
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    sysconfig no Python: caminhos e build

    Aprenda sysconfig no Python para descobrir caminhos de instalação, variáveis de build, headers, virtualenvs e plataformas com segurança.

    Ler mais

    Tempo de leitura: 7 minutos
    09/08/2026
    Disco rígido representando arquivos mapeados em memória com mmap no Python
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    mmap no Python: arquivos em memória

    Aprenda mmap no Python para mapear arquivos em memória, pesquisar bytes, compartilhar dados e escolher leitura, escrita ou copy-on-write.

    Ler mais

    Tempo de leitura: 7 minutos
    09/08/2026
    Código-fonte representando tokens e constantes do parser com o módulo token no Python
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    token no Python: constantes do parser

    Aprenda token no Python para interpretar tipos léxicos, operadores exatos, f-strings, t-strings e árvores sintáticas por versão.

    Ler mais

    Tempo de leitura: 8 minutos
    07/08/2026