Automação

Automação Fiscal com Python: Como Gerar Relatórios SPED Automaticamente

Automação Fiscal com Python: Como Gerar Relatórios SPED Automaticamente

O SPED (Sistema Público de Escrituração Digital) é o coração da conformidade fiscal das empresas brasileiras. Gerar, validar e transmitir os arquivos SPED manualmente é trabalhoso e sujeito a erros. Com Python, é possível automatizar grande parte desse processo. Este guia mostra como.

O que é o SPED e quais obrigações ele cobre

O SPED é um projeto do governo federal que unifica a escrituração fiscal e contábil das empresas num formato digital padronizado. As principais obrigações:

  • SPED Contábil (ECD): Escrituração Contábil Digital — substitui os livros contábeis físicos
  • EFD-ICMS/IPI: Escrituração Fiscal Digital para ICMS e IPI — para empresas do Lucro Real/Presumido com operações estaduais
  • EFD-Contribuições: apuração de PIS e COFINS
  • ECF: Escrituração Contábil Fiscal — apuração do IRPJ e CSLL
  • EFD-Reinf + e-Social: obrigações trabalhistas e previdenciárias

Formato dos arquivos SPED

Os arquivos SPED são textos simples com registros separados pelo caractere “|” (pipe). Exemplo de registro da EFD-ICMS:

|0000|020|0|01012026|30062026|EMPRESA TESTE LTDA|12.345.678/0001-00|SP|...|
|0150|001|FORNECEDOR XYZ LTDA|03|98765432000100|...|
|C100|1|0|001|55|00|001234|10012026|...|10000.00|...|
|C170|001|PRODUTO A|50|UN|200.00|...|

Cada registro começa com o código do bloco (0, A, B, C, D, E, G, H, I, K…) e depois o código do registro.

Lendo e analisando arquivos SPED com Python


import pandas as pd

def ler_sped(caminho, registro):
    """Extrai todos os registros de um tipo específico do SPED."""
    linhas = []
    with open(caminho, 'r', encoding='latin-1') as f:
        for linha in f:
            campos = linha.strip().split('|')
            if len(campos) > 1 and campos[1] == registro:
                linhas.append(campos)
    return linhas

# Extrai todos os registros C100 (documentos fiscais de entradas e saídas)
registros_c100 = ler_sped('EFD_ICMS_2026_01.txt', 'C100')

# Colunas do registro C100 (simplificado)
colunas_c100 = [
    'pipe1', 'reg', 'ind_oper', 'ind_emit', 'cod_part', 
    'cod_mod', 'cod_sit', 'serie', 'num_doc', 'chv_nfe',
    'dt_doc', 'dt_e_s', 'vl_doc', 'ind_pgto', 'vl_desc',
    'vl_abat_nt', 'vl_merc', 'ind_frt', 'vl_frt', 'vl_seg',
    'vl_out_da', 'vl_bc_icms', 'vl_icms', 'vl_bc_icms_st',
    'vl_icms_st', 'vl_ipi', 'vl_pis', 'vl_cofins',
    'vl_pio', 'cod_inf', 'vl_tot_det', 'pipe2'
]

df = pd.DataFrame(registros_c100, columns=colunas_c100[:len(registros_c100[0])] if registros_c100 else [])

# Converte valores numéricos
if not df.empty:
    df['vl_doc'] = pd.to_numeric(df['vl_doc'].str.replace(',', '.'), errors='coerce')
    df['vl_icms'] = pd.to_numeric(df['vl_icms'].str.replace(',', '.'), errors='coerce')
    
    # Separa entradas e saídas
    entradas = df[df['ind_oper'] == '0']
    saidas   = df[df['ind_oper'] == '1']
    
    print(f"Documentos de entrada: {len(entradas)} | Total: R$ {entradas['vl_doc'].sum():,.2f}")
    print(f"Documentos de saída:   {len(saidas)}   | Total: R$ {saidas['vl_doc'].sum():,.2f}")
    print(f"ICMS total a recolher: R$ {saidas['vl_icms'].sum() - entradas['vl_icms'].sum():,.2f}")

Validando arquivos SPED com Python

Antes de transmitir, todo arquivo SPED deve ser validado no PVA (Programa Validador e Assinador) da Receita Federal. Mas você pode fazer validações básicas por script antes:


def validar_sped_basico(caminho):
    """Validações básicas antes de passar pelo PVA."""
    erros = []
    
    with open(caminho, 'r', encoding='latin-1') as f:
        linhas = f.readlines()
    
    # Verifica registro de abertura
    if not linhas[0].startswith('|0000|'):
        erros.append("Arquivo não começa com registro 0000")
    
    # Verifica registro de encerramento
    if not linhas[-1].startswith('|9999|'):
        erros.append("Arquivo não termina com registro 9999")
    
    # Verifica se todos os registros têm pipe inicial e final
    for i, linha in enumerate(linhas, 1):
        linha = linha.strip()
        if not (linha.startswith('|') and linha.endswith('|')):
            erros.append(f"Linha {i}: formato inválido (sem pipes inicial/final)")
    
    if erros:
        print("Erros encontrados:")
        for e in erros:
            print(f"  - {e}")
    else:
        print(f"Arquivo válido: {len(linhas)} registros")
    
    return len(erros) == 0

validar_sped_basico('EFD_ICMS_2026_01.txt')

Automação completa: do ERP ao arquivo SPED

Um pipeline completo de automação:

  1. Exporta os dados do ERP via API ou exportação em CSV/Excel
  2. Script Python transforma os dados no formato SPED correspondente
  3. Validação automática dos campos obrigatórios e regras de negócio
  4. Geração do arquivo .txt no layout SPED
  5. Assinatura via PVA (ainda manual) ou via API de terceiros
  6. Transmissão pela plataforma e-CAC da Receita Federal

Bibliotecas especializadas

  • python-sped: biblioteca open source para leitura e escrita de arquivos SPED EFD
  • sped-python: outra biblioteca com suporte a múltiplos leiautes
  • nfephp-org/sped-efd: em PHP, a mais completa para EFD-ICMS/IPI

A automação fiscal com Python não substitui o conhecimento tributário — ela amplifica a capacidade do profissional que entende as regras de negócio. O ideal é a parceria entre contador (que conhece as regras) e desenvolvedor (que implementa a automação).

Tem um projeto em mente?

Somos especialistas em transformar ideias em produtos digitais. Apps, sites, automações e IA — vamos construir juntos.

Resposta rápida Orçamento sem compromisso +100 projetos entregues
Compartilhar: