rictom / cnpj-sqlite Goto Github PK
View Code? Open in Web Editor NEWScript em python para carregar os arquivos de cnpj com dados públicos da Receita Federal para o formato sqlite
License: MIT License
Script em python para carregar os arquivos de cnpj com dados públicos da Receita Federal para o formato sqlite
License: MIT License
Bom dia, o script descompactou os arquivos, mas ocorre o seguinte erro a partir do carregamento da primeira tabela (CNAE):
carregando tabela C:\dados-publicos\F.K03200$Z.D30408.CNAECSV
Traceback (most recent call last):
File "C:\Users\Tributos\Downloads\rede-cnpj-master\dados_cnpj_para_sqlite.py", line 50, in
carregaTabelaCodigo('.CNAECSV', 'cnae')
File "C:\Users\Tributos\Downloads\rede-cnpj-master\dados_cnpj_para_sqlite.py", line 47, in carregaTabelaCodigo
engine.execute(f'CREATE INDEX idx_{nomeTabela} ON {nomeTabela}(codigo);')
^^^^^^^^^^^^^^
AttributeError: 'Engine' object has no attribute 'execute'
Process finished with exit code 1
Olá
Tentei executar o script 3 vezes, nas 3 ocorreu esse erro abaixo. Já tentei excluir e baixar novamente os arquivos ZIP, mas não deu certo (mesmo erro).
executando parte 1/21:
executando parte 2/21:
update empresas
set capital_social = cast( replace(capital_social_str,',', '.') as real)
Traceback (most recent call last):
File "E:\Novo Script para criar DB de CNPJ\cnpj-sqlite-main\cnpj-sqlite-main\dados_cnpj_para_sqlite.py", line 196, in
engine.execute(sql)
sqlite3.DatabaseError: database disk image is malformed
Process finished with exit code 1
Esse caminho: 'http://200.152.38.155/CNPJ/' é um caminho público ou é alimentado de alguma outra forma? Esses arquivos são atualizados?
Muito obrigado amigo, seu script tem me ajudado muito.
Olá, com a última atualização da base de dados ao utilizar a ferramenta tive esse mesmo erro duas vezes, uma vez ontem e outra hoje, não posso confirmar se foi no mesmo arquivo.
Pelo que li ocorre quando o Content-Length do response da request retorna um valor diferença que baixado
Pode ser instabilidade do servidor da receita, será que tem algum outro pacote melhor que o urllib?
Boa noite!
Todos os arquivos ZIP baixados, utilizando o script e ao ser executado o script : dados_cnpj_para_sqlite.py, apresenta o erro abaixo.
Execução Em Linux Kali.
Início: Sun May 28 19:31:41 2023
Sun May 28 19:31:41 2023 descompactando dados-publicos-zip/Socios8.zip
Sun May 28 19:31:42 2023 descompactando dados-publicos-zip/Estabelecimentos4.zip
Sun May 28 19:31:47 2023 descompactando dados-publicos-zip/Empresas3.zip
Sun May 28 19:31:48 2023 descompactando dados-publicos-zip/Socios1.zip
Sun May 28 19:31:49 2023 descompactando dados-publicos-zip/Empresas6.zip
Sun May 28 19:31:50 2023 descompactando dados-publicos-zip/Socios0.zip
Sun May 28 19:31:52 2023 descompactando dados-publicos-zip/Estabelecimentos1.zip
Traceback (most recent call last):
File "/home/rede/cnpj-sqlite/dados_cnpj_para_sqlite.py", line 40, in
zip_ref.extractall(pasta_saida)
File "/usr/lib/python3.11/zipfile.py", line 1677, in extractall
self._extract_member(zipinfo, path, pwd)
File "/usr/lib/python3.11/zipfile.py", line 1732, in _extract_member
shutil.copyfileobj(source, target)
File "/usr/lib/python3.11/shutil.py", line 197, in copyfileobj
buf = fsrc_read(length)
^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.11/zipfile.py", line 951, in read
data = self._read1(n)
^^^^^^^^^^^^^^
File "/usr/lib/python3.11/zipfile.py", line 1041, in _read1
self._update_crc(data)
File "/usr/lib/python3.11/zipfile.py", line 969, in _update_crc
raise BadZipFile("Bad CRC-32 for file %r" % self.name)
zipfile.BadZipFile: Bad CRC-32 for file 'K3241.K03200Y1.D30513.ESTABELE'
Primeiramente. Obrigado pelo trabalho e disponibilização de tempo e do projeto publicamente.
Agora indo ao problema:
Eu gostaria de usar ORMs que facilitam o desenvolvimento de queries (Prisma ou Drizzle).
O problema é que criando a DB sem uma PK ele simplesmente me pede para adicionar uma PK, e como eu planejo deixar o DB atualizado sempre é um processo que poderia (talvez?) ser incrementado no próprio script.
É uma ideia, se for viável a criação das tabelas com uma coluna para cada tabela com um id auto incrementável.
Exemplo do Prisma:
provider = "prisma-client-js"
}
datasource db {
provider = "sqlite"
url = "file:../db/cnpj.db"
}
/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client.
model referencia {
id Int @id @default(autoincrement())
referencia String?
valor String?
@@map("_referencia")
@@ignore
}
/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client.
model cnae {
codigo String?
descricao String?
@@index([codigo], map: "idx_cnae")
@@ignore
}
model empresas {
cnpj_basico String? @id
razao_social String?
natureza_juridica String?
qualificacao_responsavel String?
porte_empresa String?
ente_federativo_responsavel String?
capital_social Float?
@@index([razao_social], map: "idx_empresas_razao_social")
@@index([cnpj_basico], map: "idx_empresas_cnpj_basico")
@@ignore
}
[...]
Se houver viabilidade posso tentar e enviar pra cá, venho aqui primeiro por que phyton não é meu forte.
Durante alguns testes, notei um problema na etapa 3. O erro é em relação a uma parte da variável sql, especificamente na query ALTER TABLE empresas DROP COLUMN capital_social_str;. Fiz o debug do código e removendo essa linha tudo ocorre perfeitamente. Pelo que pude compreender, a remoção dessa linha não interfere no resultado final já que provavelmente esta coluna não será utilizada posteriormente. Talvez o único ônus, ao meu entender, é na performance e no espaço ocupado. Percebi também que essa linha foi adicionada na última alteração desse arquivo, então pode não ter sido testada.
Durante a etapa do debug rodei a seguinte query: PRAGMA table_info(empresas); No output desta query consta a coluna capital_social_str. Ou seja, o erro não é pela inexistência da coluna.
Não cheguei a tentar corrigir o problema. Caso encontre alguma solução atualizo aqui.
** OS: debian 11
Boa noite!
Primeiro gostaria de agradecer a esse pacote! Facilitou muito a vida!
Mas ainda estou com uma dificuldade. É a primeira vez que trabalho com os dados do CNPJ neste formato e utilizando este programa. Não consegui importar para o postgreSQL.
Destes dados, preciso separar aquelas CNPJ que são de cooperativas, ou seja com natureza_juridica = 2143
ou natureza_juridica = 2330
.
Isto já irá reduzir bastente o tamanho dos arquivos e poderei trabalhar mais fácil com ele em meu computador, usando o R.
Entretanto, não estou conseguindo fazer o filtro e nem encontrando como salvar as tabelas do possível resultado em outro formato.
select t.*, te.*, ts.*
from empresas te
left join estabelecimento t on t.cnpj_basico=te.cnpj_basico
left join socios ts on ts.cnpj_basico=te.cnpj_basico
where te.natureza_juridica like '2143'
and te.natureza_juridica like '2330'
Boa tarde Amigos!
Alguém que já trabalhe com dados da receita há mais tempo tem os dados de estabelecimentos que foram disponibilizados pela receita federal no inicio de 2020?
Att, Pedro
Tudo bem?
Estou tentando fazer uma consulta por CNAE, mas não consegui usar os scripts de exemplo para isso (não sou programador). Como faço pra consultar filtrando por CNAE? obrigado desde já!
acho que o banco que eu tenho já tem os cnae secundário, isso no mysql, pois importei o banco do sqlite
na tabela estabelecimentos tem um campo cnae_fiscal_secundaria
essa rotina do .py faz é separar em outra tabela?
Originally posted by @fredroo in #27 (comment)
Prezado, não sou técnico e gostaria, se possível, de uma ajuda
Quando executo o script, apresenta este erro:
Sun Jan 29 21:13:17 2023 descompactando dados-publicos-zip\Socios9.zip
carregando tabela dados-publicos\F.K03200$Z.D30114.CNAECSV
Traceback (most recent call last):
File "K:\Nova pasta\dados_cnpj_para_sqlite.py", line 50, in
carregaTabelaCodigo('.CNAECSV','cnae')
File "K:\Nova pasta\dados_cnpj_para_sqlite.py", line 48, in carregaTabelaCodigo
engine.execute(f'CREATE INDEX idx_{nomeTabela} ON {nomeTabela}(codigo);')
^^^^^^^^^^^^^^
AttributeError: 'Engine' object has no attribute 'execute'
O que pode ser?
Bom Dia,
Primeiramente,
Gostaria de lhe parabenizar pelo projeto.
Em seguida lhe informo que não estou conseguindo finalizar a instalação local.
Tutorial para o Test tudo certo.
Agora, para usar a Base Completa, travou.
Segui o passo a passo, baixando todos os arquivos, criando pastas, instalando bibliotecas pelo pip txt, mas quando coloco para rodar o python dados_cnpj_para_sqlite.py
Aparece a seguinte mensagem de erro:
(...) line 72 <title>cnpj-sqlite/dados_cnpj_lista_url.py at main · rictom/cnpj-sqlite · GitHub</title>
SyntaxError: invalid character '·' (U+00B7)
Como resolver?
Lhe agradeço imensamente,
É possivel buscar por dados como cnpj, telefone e endereço a partir do nome fantasia do estabelecimento ?
Trabalho na área de prospecção de uma empresa em busca de potenciais clientes, e estou tentar por em prática meus estudos em python!
Boa noite!
Tudo bem?
Estou com dificuldades em concatenar umas tabelas de forma que não se dupliquem por causa do nome dos socios, então estou apelando para o GROUP_CONCAT().
Porém, da forma que estou fazendo no Python não é retornado um erro e fica em loop eterno. Pode tentar me ajudar?
Testes de queries funcionais:
'''
SELECT
socios.cnpj,
GROUP_CONCAT(socios.nome_socio) AS "SoCIOS"
FROM socios
GROUP BY socios.cnpj
LIMIT 1;
'''
Dessa forma o nome dos sócios ficam em uma linha, impedindo duplicata.
"""
SELECT *
FROM estabelecimento
INNER JOIN socios ON estabelecimento.cnpj_basico=socios.cnpj_basico
LEFT JOIN empresas ON estabelecimento.cnpj_basico=empresas.cnpj_basico
LIMIT 5;
"""
Dessa forma, consigo unir 3 tabelas para gerar um DataFrame com Pandas. Porém, os nomes duplicam os resultados da consulta de acordo com a quantidade de nomes de sócios para a mesma chave.
Minhas tentativas de solução para realizar aquelas duas operações em uma query:
"""
SELECT
estabelecimento.cnae_fiscal,
estabelecimento.nome_fantasia,
empresas.razao_social,
(SELECT GROUP_CONCAT(socios.nome_socio) FROM socios WHERE estabelecimento.cnpj_basico = socios.cnpj_basico) AS "Socios"
FROM estabelecimento
INNER JOIN socios ON estabelecimento.cnpj_basico=socios.cnpj_basico
LEFT JOIN empresas ON estabelecimento.cnpj_basico=empresas.cnpj_basico
GROUP BY estabelecimento.cnpj_basico
LIMIT 4;
"""
"""
SELECT
estabelecimento.cnae_fiscal,
estabelecimento.nome_fantasia,
empresas.razao_social,
(SELECT GROUP_CONCAT(socios.nome_socio) FROM socios) AS "Socios"
FROM estabelecimento
INNER JOIN socios ON estabelecimento.cnpj_basico=socios.cnpj_basico
LEFT JOIN empresas ON estabelecimento.cnpj_basico=empresas.cnpj_basico
GROUP BY estabelecimento.cnpj_basico
LIMIT 4;
"""
"""
SELECT
estabelecimento.cnae_fiscal,
estabelecimento.nome_fantasia,
empresas.razao_social,
GROUP_CONCAT(socios.nome_socio) AS "Socios"
FROM estabelecimento
INNER JOIN socios ON estabelecimento.cnpj_basico=socios.cnpj_basico
LEFT JOIN empresas ON estabelecimento.cnpj_basico=empresas.cnpj_basico
GROUP BY estabelecimento.cnpj_basico
LIMIT 4;
"""
Todas essas tentativas não me retornam dados nem erros. O python fica eternamente carregando/rodando e nada acontece.
Criei o projeto https://github.com/rictom/cnpj-mysql para carregar os dados em um servidor mysql.
Fiz o download dos arquivos que estão disponíveis no Google Drive.
Entretando, percebi que na tabela estabelecimento
não consta a coluna Natureza Jurídica
.
Ficou apenas a tabela com as descrições da Natureza Jurídica.
A RFB retirou essa informação ou ela foi excluída no tratamento?
Arquivo sqlite, referência 9/10/2021 (.D11009.), está disponível no google drive, zipado em 3 pedaços: https://drive.google.com/drive/folders/1Gkeq27aHv6UgT8m30fc4hZWMPqdhEHWr?usp=sharing
Opa, já agradeço por disponibilizar os dados abertos de CNPJ em SQLITE atualizados.
Gostaria de saber se você teria como disponibilizar os arquivos dos últimos 12 meses?
Ou melhor, arquivos de 07/2021, 01/2022 e 07/2022?
Prezados, peço uma ajuda;
por favor, como posso retornar os dados de Natureza Jurídica "4120 - produtor rural"?
preciso ter uma base completa com dados (nome, endereço, telefone, etc) de Produtores Rurais; por favor, podem me ajudar qual o script para uso no DB Browser?
Olá, estou rodando o script. Todos os arquivos foram baixados. Deixei o script rodando a madrugada e ocorreu o seguinte erro:
"sqlite3.OperationalError: database or disk is full"
Segue a íntegra:
executando parte 1/21:
executando parte 2/21:
executando parte 3/21:
executando parte 4/21:
executando parte 5/21:
Update estabelecimento
set cnpj = cnpj_basico||cnpj_ordem||cnpj_dv
Traceback (most recent call last):
File "C:\Users\arake\anaconda3\lib\site-packages\sqlalchemy\engine\base.py", line 1900, in _execute_context
self.dialect.do_execute(
File "C:\Users\arake\anaconda3\lib\site-packages\sqlalchemy\engine\default.py", line 736, in do_execute
cursor.execute(statement, parameters)
sqlite3.OperationalError: database or disk is full
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "C:\Users\arake\OneDrive\Documentos\rede-cnpj-master\cnpj-sqlite-main\dados_cnpj_para_sqlite.py", line 194, in
engine.execute(sql)
File "", line 2, in execute
File "C:\Users\arake\anaconda3\lib\site-packages\sqlalchemy\util\deprecations.py", line 468, in warned
return fn(*args, **kwargs)
File "C:\Users\arake\anaconda3\lib\site-packages\sqlalchemy\engine\base.py", line 3257, in execute
return connection.execute(statement, *multiparams, **params)
File "C:\Users\arake\anaconda3\lib\site-packages\sqlalchemy\engine\base.py", line 1365, in execute
return self._exec_driver_sql(
File "C:\Users\arake\anaconda3\lib\site-packages\sqlalchemy\engine\base.py", line 1669, in _exec_driver_sql
ret = self._execute_context(
File "C:\Users\arake\anaconda3\lib\site-packages\sqlalchemy\engine\base.py", line 1943, in _execute_context
self.handle_dbapi_exception(
File "C:\Users\arake\anaconda3\lib\site-packages\sqlalchemy\engine\base.py", line 2124, in handle_dbapi_exception
util.raise(
File "C:\Users\arake\anaconda3\lib\site-packages\sqlalchemy\util\compat.py", line 211, in raise
raise exception
File "C:\Users\arake\anaconda3\lib\site-packages\sqlalchemy\engine\base.py", line 1900, in _execute_context
self.dialect.do_execute(
File "C:\Users\arake\anaconda3\lib\site-packages\sqlalchemy\engine\default.py", line 736, in do_execute
cursor.execute(statement, parameters)
sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) database or disk is full
[SQL:
Update estabelecimento
set cnpj = cnpj_basico||cnpj_ordem||cnpj_dv]
(Background on this error at: https://sqlalche.me/e/14/e3q8)
Ricardo, obrigado pela disponibilização desta base de dados nessa forma organizada que você fez.
Utilizo o DB Browser e tenho 2 necessidades:
Tentei esse código e não consegui:
SELECT
*
FROM
estabelecimentos empresaas,
estabelecimentos empresas
WHERE
estabelecimentos.cnpj = socios.cnpj AND
estabelecimentos.cnae_fiscal LIKE '8112%' AND
estabelecimentos.uf = 'SP'
Pode me ajudar?
Quando executo o código:
python dados_cnpj_para_sqlite.py
Ele me retorna esse erro aqui:
Traceback (most recent call last):
File "C:\Users\bielk\OneDrive\Documentos\Banco Receita\cnpj-sqlite-main\dados_cnpj_para_sqlite.py", line 52, in <module>
carregaTabelaCodigo('.CNAECSV','cnae')
File "C:\Users\bielk\OneDrive\Documentos\Banco Receita\cnpj-sqlite-main\dados_cnpj_para_sqlite.py", line 46, in carregaTabelaCodigo
arquivo = list(glob.glob(os.path.join(pasta_saida, '*' + extensaoArquivo)))[0]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^
IndexError: list index out of range
Quando tento executar de novo, acontece isso:
O arquivo dados-publicos\cnpj.db já existe. Apague-o primeiro e rode este script novamente.
Olá, Existe a possibilidade de unir a tabela "SIMPLES" com a informação do OPC MEI na tabela "ESTABELECIMENTOS"? pois preciso das informações que existem na aba "ESTABELECIMENTO" com filtro do OPC_MEI em "S"
Em continuidade a minha pergunta anterior, preciso de um código/script que eu insiro o CNAE e puxa todas as tabelas de todo o Brasil (no exemplo anterior eu colocaria a UF, mas aqui é para o Brasil todo);
SELECT
*
FROM
estabelecimentos empresas,
estabelecimentos empresas
WHERE
estabelecimentos.cnpj = estabelecimentos.cnpj AND empresas.cnae_fiscal LIKE '0810%'
Mas preciso de uma ajuda.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.