e-DNE Correios Loader
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, comopostgresql,mysql,sqlite, etc.driveré o nome do driver do banco de dados, comopsycopg2,mysqlclient,pg8000, etc. Se não especificado, o driver mais popular é utilizado automaticamente.usernameé o nome de usuário do banco de dadospasswordé a senha do usuário do banco de dadoshosté o endereço do servidor do banco de dadosporté a porta do servidor do banco de dadosdatabaseé 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 CEPscep-tables: Mantém apenas as tabelas com CEPs, separadas por tipoall: 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, ondeoriginalé o nome padrão da tabela ecustomé 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:
- Clone o projeto:
git clone https://github.com/cauethenorio/edne-correios-loader
- Rode os containers Docker com MySQL e PostgreSQL:
cd edne-correios-loader/tests
docker compose up -d
- 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)
| File | Size | Uploaded | |
|---|---|---|---|
| edne_correios_loader-1.2.0.tar.gz | 98.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| 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}
|