aphonsoar / Receita_Federal_do_Brasil_-_Dados_Publicos_CNPJ

Dados Públicos de CNPJ disponibilizados pela Receita Federal do Brasil
MIT License
253 stars 108 forks source link

Erro na decodificação #21

Closed adricaceres closed 1 year ago

adricaceres commented 2 years ago

Pessoal, está ocorrendo esse erro quando executo o python. Na tabela de empresas foi tudo ok mas quando inicia a tabela de estabelecimentos, depois de umas 15hrs executando ele da esse erro na imagem. Alguém saberia o que pode estar ocorrendo? Aparentemente é memória, apenas gostaria de confirmar. Obrigado

image

aphonsoar commented 2 years ago

Adria, é lack de memória mesmo. Precisaria ajustar o código ou mudar a infra

adricaceres commented 2 years ago

Obrigado pelo retorno Aphonso. Estou com um i7 com 8gb, por enquanto não consigo mudar a infra. Sobre ajustar o código, o que você sugere?

aphonsoar commented 2 years ago

Entao, isso e um pouco complexo porque depende de cada infraestrutura mesmo. Por exemplo, esse codigo eu construi no meu laptop que tambem eh um i7 com 8gb, mas pra mim funcionou... De qualquer forma, na tabela do SIMPLES eu tambem tive lack de memoria e entao eu fiz um ajuste no codigo para particionar o arquivo de 1 milhao em 1 milhao de registros. Veja isso nas linhas entre 365 a 420 do arquivo ETL_coletar_dados_e_gravar_BD.py. O ideal seria implementar esse particionamento para as demais tabelas tambem, coisa que eu nao fiz, rs. Isso que seria o ajuste de codigo.

Se vc conseguir fazer e mandar um PR, seria muito util, basicamente pode copiar essa estrutura e adaptar para a tabela estabelecimentos.

adricaceres commented 2 years ago

Excelente Aphonso, vou fazer esses ajustes nas demais tabelas e estando tudo ok eu mando um PR. Vou te informando qualquer novidade. Muito obrigado pela atenção.

GleisonSette commented 2 years ago

Olá, tudo bem? Alguem conseguiu fazer isso e enviar o PR?

GleisonSette commented 2 years ago

`

Verificar tamanho do arquivo:

print('Lendo o arquivo ' + arquivos_estabelecimento[e]+' [...]')
extracted_file_path = Path(f'{extracted_files}/{arquivos_estabelecimento[e]}')

estabelecimento_lenght = sum(1 for line in open(extracted_file_path, "r"))
print('Linhas no arquivo do Simples '+ arquivos_estabelecimento[e] +': '+str(estabelecimento_lenght))

tamanho_das_partes = 1000000 # Registros por carga
partes = round(estabelecimento_lenght / tamanho_das_partes)
nrows = tamanho_das_partes
skiprows = 0

print('Este arquivo será dividido em ' + str(partes) + ' partes para inserção no banco de dados')

for i in range(0, partes):
    print('Iniciando a parte ' + str(i+1) + ' [...]')

`

Não sei progamação... "copiei o codigo do simples e acrescentei no estabelecimento que tive o mesmo erro. Fiz conforme está acima. Aparentemente está dando certo. Se for bem sucedido avisarei aqui.

GleisonSette commented 2 years ago

Não deu certo.... Tudo rodou lindo, so falta o estabelecimento

Erro apresentado:

Trabalhando no arquivo: K3241.K03200Y0.D20514.ESTABELE [...] Lendo o arquivo K3241.K03200Y0.D20514.ESTABELE [...] Linhas no arquivo do Simples K3241.K03200Y0.D20514.ESTABELE: 9789023 Este arquivo será dividido em 10 partes para inserção no banco de dados Iniciando a parte 1 [...] Iniciando a parte 2 [...] Iniciando a parte 3 [...] Iniciando a parte 4 [...] Iniciando a parte 5 [...] Iniciando a parte 6 [...] Iniciando a parte 7 [...] Iniciando a parte 8 [...] Iniciando a parte 9 [...] Iniciando a parte 10 [...] Arquivo K3241.K03200Y0.D20514.ESTABELE inserido com sucesso no banco de dados! - Parte 10 Trabalhando no arquivo: K3241.K03200Y1.D20514.ESTABELE [...] Lendo o arquivo K3241.K03200Y1.D20514.ESTABELE [...] Traceback (most recent call last): File "C:\Hunter_CNPJ\code\ETL_coletar_dados_e_gravar_BD.py", line 130, in estabelecimento_lenght = sum(1 for line in open(extracted_file_path, "r")) File "C:\Hunter_CNPJ\code\ETL_coletar_dados_e_gravar_BD.py", line 130, in estabelecimento_lenght = sum(1 for line in open(extracted_file_path, "r")) File "C:\Users\gleis\AppData\Local\Programs\Python\Python310\lib\encodings\cp1252.py", line 23, in decode return codecs.charmap_decode(input,self.errors,decoding_table)[0] UnicodeDecodeError: 'charmap' codec can't decode byte 0x8f in position 1423: character maps to

GleisonSette commented 2 years ago

Vou aguardar a solução...

GleisonSette commented 2 years ago

Boa tarde! Consegui resolver conforme o modelo abaixo:

`

%%

Arquivos de estabelecimento:

estabelecimento_insert_start = time.time() print(""" ###############################

Arquivos de ESTABELECIMENTO:

############################### """)

Drop table antes do insert

cur.execute('DROP TABLE IF EXISTS "estabelecimento";') conn.commit()

for e in range(0, len(arquivos_estabelecimento)): print('Trabalhando no arquivo: '+arquivos_estabelecimento[e]+' [...]') try: del estabelecimento except: pass

# Verificar tamanho do arquivo:
print('Lendo o arquivo ' + arquivos_estabelecimento[e]+' [...]')
extracted_file_path = Path(f'{extracted_files}/{arquivos_estabelecimento[e]}')   

estabelecimento_tamanho = sum(1 for line in open(extracted_file_path, "r", encoding="mbcs"))
print('Linhas no arquivo do Estabelecimento ' + arquivos_estabelecimento[e] +': '+str(estabelecimento_tamanho))

tamanho_das_partes = 1000000 # Registros por carga
partes = round(estabelecimento_tamanho / tamanho_das_partes)
nrows = tamanho_das_partes
skiprows = 0

print('Este arquivo será dividido em ' +str(partes) + ' partes para inserção no banco de dados')

for i in range(0, partes):
    print('Iniciando a parte ' + str(i+1) + ' [...]')

    estabelecimento = pd.DataFrame(columns=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28])
    estabelecimento_dtypes = {1: 'object', 2: 'object', 3: 'object', 4: 'object', 5: 'object', 6: 'object', 7: 'object', 8: 'object', 9: 'object', 10: 'object', 11: 'object', 12: 'object', 13: 'object', 14: 'object', 15: 'object', 16: 'object', 17: 'object', 18: 'object', 19: 'object', 20: 'object', 21: 'object', 22: 'object', 23: 'object', 24: 'object', 25: 'object', 26: 'object', 27: 'object', 28: 'object'}
    extracted_file_path = Path(f'{extracted_files}/{arquivos_estabelecimento[e]}')

    estabelecimento = pd.read_csv(filepath_or_buffer=extracted_file_path, encoding = "ISO-8859-1",
                                  sep=';',
                                  nrows=nrows,
                                  skiprows=skiprows,
                                  header=None,
                                  dtype=estabelecimento_dtypes)

    # Tratamento do arquivo antes de inserir na base:
    estabelecimento = estabelecimento.reset_index()
    del estabelecimento['index']

    # Renomear colunas
    estabelecimento.columns = ['cnpj_basico',
                               'cnpj_ordem',
                               'cnpj_dv',
                               'identificador_matriz_filial',
                               'nome_fantasia',
                               'situacao_cadastral',
                               'data_situacao_cadastral',
                               'motivo_situacao_cadastral',
                               'nome_cidade_exterior',
                               'pais',
                               'data_inicio_atividade',
                               'cnae_fiscal_principal',
                               'cnae_fiscal_secundaria',
                               'tipo_logradouro',
                               'logradouro',
                               'numero',
                               'complemento',
                               'bairro',
                               'cep',
                               'uf',
                               'municipio',
                               'ddd_1',
                               'telefone_1',
                               'ddd_2',
                               'telefone_2',
                               'ddd_fax',
                               'fax',
                               'correio_eletronico',
                               'situacao_especial',
                               'data_situacao_especial']

    # Gravar dados no banco:
    # estabelecimento
    estabelecimento.to_sql(name='estabelecimento', con=engine, if_exists='append', index=False)
    print('Arquivo ' + arquivos_estabelecimento[e] + ' inserido com sucesso no banco de dados! - Parte '+ str(i+1))

    try:
        del estabelecimento
    except:
        pass

try: del estabelecimento except: pass

print('Arquivos de estabelecimento finalizados!') estabelecimento_insert_end = time.time() estabelecimento_Tempo_insert = round((estabelecimento_insert_end - estabelecimento_insert_start)) print('Tempo de execução do processo de estabelecimento (em segundos): ' + str(estabelecimento_Tempo_insert)) `

Solução encontrado em: https://stackoverflow.com/questions/53954988/python-unicodedecodeerror-charmap-codec-cant-decode-byte-0x9d-in-position