Skip to main content

Load Brazilian Correios' e-DNE Basico text files into your database to enable CEP search

Project description

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.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

edne_correios_loader-1.2.0.tar.gz (98.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

edne_correios_loader-1.2.0-py3-none-any.whl (22.1 kB view details)

Uploaded Python 3

File details

Details for the file edne_correios_loader-1.2.0.tar.gz.

File metadata

  • Download URL: edne_correios_loader-1.2.0.tar.gz
  • Upload date:
  • Size: 98.5 kB
  • Tags: Source
  • Uploaded using 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}

File hashes

Hashes for edne_correios_loader-1.2.0.tar.gz
Algorithm Hash digest
SHA256 ee9dbe08f931c17406466abdcf0ac66adb14b6138ac98ced412f5c4f5a49b3c9
MD5 96528433436f462d24565cd177f73c73
BLAKE2b-256 ab4f83103435844f589fcfa286776fb08f8e039520ccc8e64bc1e518bcd9b362

See more details on using hashes here.

File details

Details for the file edne_correios_loader-1.2.0-py3-none-any.whl.

File metadata

  • Download URL: edne_correios_loader-1.2.0-py3-none-any.whl
  • Upload date:
  • Size: 22.1 kB
  • Tags: Python 3
  • Uploaded using 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}

File hashes

Hashes for edne_correios_loader-1.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 92e9f00af648223621f03535f265c3f96533fc8f2a5a64b8858ff0fcfd50a7ca
MD5 79e9cdb289cd2712c76fd0c215411c5c
BLAKE2b-256 b23a3cecbdc715a7f7fb3e0dd54464ba310966c9b27eb854464f4da5252be203

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page