Skip to main content

e-DNE Correios Loader

PyPI - Version PyPI - Python Version codecov

Carregue todos os CEPs do Brasil no seu banco de dados com um único comando.

O e-DNE (Diretório Nacional de Endereços) dos Correios contém mais de 1,5 milhão de CEPs e está disponível gratuitamente. Esta ferramenta baixa automaticamente a versão mais recente, processa os arquivos e carrega em qualquer banco de dados (PostgreSQL, MySQL, SQLite, etc.), criando uma tabela unificada pronta para consulta.

uvx edne-correios-loader load --database-url sqlite:///dne.db

English version 🇺🇸

Quick Start

Com uv instalado, execute diretamente sem precisar instalar:

uvx edne-correios-loader load --database-url sqlite:///dne.db

Para PostgreSQL:

uvx --from 'edne-correios-loader[postgresql]' edne-correios-loader load \
  --database-url postgresql://user:pass@localhost:5432/mydb

Após a importação, consulte CEPs:

$ edne-correios-loader query-cep --database-url sqlite:///dne.db 01001000
{
  "cep": "01001000",
  "logradouro": "Praça da Sé",
  "complemento": null,
  "bairro": "Sé",
  "municipio": "São Paulo",
  "municipio_cod_ibge": 3550308,
  "uf": "SP",
  "nome": null
}

O que faz

  • Baixa automaticamente o e-DNE Básico do site dos Correios
  • Processa os arquivos de texto e carrega em um banco de dados
  • Cria uma tabela unificada para consulta de CEPs (não inclusa no DNE original)
  • Suporta PostgreSQL, MySQL, SQLite e outros bancos via SQLAlchemy
  • Permite personalizar os nomes das tabelas criadas
  • Atualiza os dados sem interrupção do serviço (transação atômica)
  • Atualizações quinzenais: basta rodar o comando novamente

Instalação

Caso prefira instalar o pacote ao invés de usar uvx:

pip install edne-correios-loader

Também será necessário instalar o driver do banco de dados que será utilizado:

PostgreSQL

pip install edne-correios-loader[postgresql]

Se não houver uma versão compilada do psycopg2 para seu sistema operacional e versão do python, outra opção é instalar o driver pg8000, escrito totalmente em Python.

MySQL

pip install edne-correios-loader[mysql]

SQLite

O Python já disponibiliza a biblioteca sqlite3, não é necessária nenhuma instrução adicional.

Outros

Qualquer banco de dados suportado pelo SQLAlchemy pode ser utilizado, como Microsoft SQL Server e Oracle.

Utilização

Linha de comando

$ edne-correios-loader load --help

Usage: edne-correios-loader load [OPTIONS]

  Load DNE data into a database.

Options:
  -s, --dne-source <path/zip-file/url>
                                  Path or URL with the DNE file/dir to be
                                  imported
  -db, --database-url <url>       Database URL where the DNE data will be
                                  imported to  [required]
  --tables [unified-cep-only|cep-tables|all]
                                  Which tables to keep in the database after
                                  the import
  --table-name <original=custom>  Rename a table: --table-name original=custom
  -v, --verbose                   Enables verbose mode.
  -h, --help                      Show this message and exit.

Opções

  • --dne-source (opcional)

    Origem do e-DNE a ser importado. Pode ser:

    • Uma URL apontando para um arquivo ZIP com o e-DNE
    • O caminho local para um arquivo ZIP com o e-DNE
    • O caminho local para um diretório contendo os arquivos do e-DNE

    Se essa opção não for informada, o último e-DNE Básico disponível no site dos Correios será baixado automaticamente e utilizado como fonte.

  • --database-url (obrigatório)

    URL do banco de dados onde os dados do e-DNE serão importados. A URL deve seguir o padrão dialect+driver://username:password@host:port/database, onde:

    • dialect é o nome do banco de dados, como postgresql, mysql, sqlite, etc.
    • driver é o nome do driver do banco de dados, como psycopg2, mysqlclient, pg8000, etc. Se não especificado, o driver mais popular é utilizado automaticamente.
    • username é o nome de usuário do banco de dados
    • password é a senha do usuário do banco de dados
    • host é o endereço do servidor do banco de dados
    • port é a porta do servidor do banco de dados
    • database é o nome do banco de dados

    Mais informações sobre o formato da URL podem ser encontradas na documentação do SQLAlchemy

  • --tables (opcional)

    Define quais tabelas serão mantidas no banco de dados após a importação. Pode ser:

    • unified-cep-only: Mantém apenas a tabela unificada de CEPs
    • cep-tables: Mantém apenas as tabelas com CEPs, separadas por tipo
    • all: Mantém todas as tabelas do DNE

    Quando não especificado, a opção unified-cep-only é utilizada por padrão, mantendo apenas a tabela unificada de CEPs.

  • --table-name (opcional)

    Permite personalizar o nome de uma tabela no banco de dados. Pode ser utilizado múltiplas vezes para renomear várias tabelas. O formato é original=custom, onde original é o nome padrão da tabela e custom é o nome desejado.

    Exemplo: --table-name cep_unificado=correios_cep

    Útil para integrar com projetos que seguem convenções de nomeação das tabelas.

  • --verbose (opcional)

    Habilita o modo verboso, que exibe informações de DEBUG úteis para resolver problemas na execução do comando

Exemplos de uso

Importa o e-DNE Básico direto do site dos Correios para um banco de dados SQLite local:

edne-correios-loader load --database-url sqlite:///dne.db

O mesmo para PostgreSQL:

edne-correios-loader load --database-url postgresql://user:pass@localhost:5432/mydb

Renomeando a tabela unificada:

edne-correios-loader load \
  --database-url sqlite:///dne.db \
  --table-name cep_unificado=correios_cep

Consulta de CEPs

Após a importação, é possível checar se os dados foram importados corretamente consultando CEPs na tabela unificada através do comando edne-correios-loader query-cep.

Se a tabela unificada foi renomeada durante a importação, use a opção --cep-table-name:

edne-correios-loader query-cep --database-url sqlite:///dne.db --cep-table-name correios_cep 01001000

API Python

O edne-correios-loader também pode ser utilizado como uma biblioteca Python, através do módulo edne_correios_loader. Exemplo:

from edne_correios_loader import DneLoader, TableSetEnum

DneLoader(
  # URL de conexão com o banco de dados (obrigatório)
  'postgresql://user:pass@localhost:5432/mydb',
  # Caminho ou URL para o arquivo ZIP ou diretório com os arquivos do e-DNE (opcional)
  # Quando omitido, o e-DNE será baixado automaticamente do site dos Correios
  dne_source="/path/to/dne.zip",
  # Personaliza os nomes das tabelas no banco de dados (opcional)
  # Aceita um dict ou um callable que transforma os nomes
  table_names={"cep_unificado": "correios_cep"},
).load(
  # Quais tabelas manter no banco de dados após a importação (opcional)
  # quando omitido apenas a tabela unificada é mantida
  # Outras opções são TableSetEnum.CEP_TABLES e TableSetEnum.ALL
  table_set=TableSetEnum.CEP_TABLES
)

O parâmetro table_names também aceita um callable para transformar todos os nomes:

DneLoader(
  'sqlite:///dne.db',
  table_names=lambda name: f"dne_{name}",  # dne_cep_unificado, dne_log_localidade, etc.
).load()

Após a importação, os CEPs podem ser consultados na tabela unificada através da classe CepQuerier:

from edne_correios_loader import CepQuerier

# Se a tabela foi renomeada, informe o nome personalizado
cep_querier = CepQuerier(
  'postgresql://user:pass@localhost:5432/mydb',
  cep_table_name='correios_cep',  # opcional, padrão: 'cep_unificado'
)
cep = cep_querier.query('01319010')

assert cep == {
  'cep': '79290000',
  'logradouro': None,
  'complemento': None,
  'bairro': None,
  'municipio': 'Bonito',
  'municipio_cod_ibge': 5002209,
  'uf': 'MS',
  'nome': None
}

Atualização dos CEPs

Quinzenalmente os Correios atualizam o e-DNE com novos CEPs. Para atualizar sua base de dados, basta executar novamente o comando load. O e-DNE mais recente será baixado automaticamente do site dos Correios.

Todo o processo é executado em uma transação, portanto, outros clientes conectados no banco continuarão tendo acesso aos dados antigos enquanto a atualização é executada. Se algo der errado durante a atualização, a transação será desfeita e os dados antigos serão mantidos.

Testes

Para executar os testes, é necessário a instalação do Docker e do uv. Após a instalação:

  1. Clone o projeto:
git clone https://github.com/cauethenorio/edne-correios-loader
  1. Rode os containers Docker com MySQL e PostgreSQL:
cd edne-correios-loader/tests
docker compose up -d
  1. Execute os testes usando o uv:
uv run pytest tests

Licença

Esse projeto é distribuído sob os termos da licença MIT.

Metadata

Release files for edne-correios-loader 1.2.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for edne-correios-loader 1.2.0
File Size Uploaded
edne_correios_loader-1.2.0.tar.gz 98.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for edne-correios-loader 1.2.0
File Interpreter ABI Platform
edne_correios_loader-1.2.0-py3-none-any.whl Python 3 none any Details

Total release size: 120.6 kB

Release files / edne_correios_loader-1.2.0.tar.gz

Download URL edne_correios_loader-1.2.0.tar.gz
Size 98.5 kB
Tags Source
SHA-256 checksum
How to use checksums
ee9dbe08f931c17406466abdcf0ac66adb14b6138ac98ced412f5c4f5a49b3c9
BLAKE2b-256 checksum
How to use checksums
ab4f83103435844f589fcfa286776fb08f8e039520ccc8e64bc1e518bcd9b362
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.10.8 {"installer":{"name":"uv","version":"0.10.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / edne_correios_loader-1.2.0-py3-none-any.whl

Download URL edne_correios_loader-1.2.0-py3-none-any.whl
Size 22.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
92e9f00af648223621f03535f265c3f96533fc8f2a5a64b8858ff0fcfd50a7ca
BLAKE2b-256 checksum
How to use checksums
b23a3cecbdc715a7f7fb3e0dd54464ba310966c9b27eb854464f4da5252be203
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.10.8 {"installer":{"name":"uv","version":"0.10.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release history Release notifications | RSS feed

This release

1.2.0 This release

2 release files

1.1.0

2 release files

1.0.0

2 release files

0.2.0

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page