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

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc3 in position 3: invalid continuation byte #4

Closed jeff-pal closed 2 years ago

jeff-pal commented 3 years ago

Estou obtendo o erro UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc3 in position 3: invalid continuation byte no linux ubuntu, conforme ilustrado na imagem a seguir:

image

Solução: a solução foi adicionar o parâmetro engine='python' em todas as chamadas para a função read_csv():

image

aphonsoar commented 3 years ago

@jeff-pal obrigado pela dica. Esse problema ocorre pela diferença do encoding mesmo, eu fiz o processo em Windows e o Linux usa outro.

Estou pensando qual seria a melhor solução, se passar a engine, como vc sugeriu, ou forçar o encoding na leitura do pd.read_csv; como por exemplo, usando o encoding='ANSI'. Digo isso porque nos arquivos: cnae, moti, munic, natju, pais e quals, eu tive que passar esse parâmetro do ANSI, caso contrário a formatação dos caracteres fica incorreta - ele substitui o ç e os acentos por caracteres especiais.

Será que passando apenas o encoding='ANSI' nos arquivos de empresa, estabelecimento, sócio e simples esse issue que vc percebeu também não se corrige?

jeff-pal commented 3 years ago

Realmente @aphonsoar, a solução que propus não vai funcionar para todos os casos. No processo de Estabelecimento, por exemplo, não funcionou com engine='python':

pandas.errors.ParserError: NULL byte detected. This byte cannot be processed in Python's native csv library at the moment, so please pass in engine='c' instead

aphonsoar commented 3 years ago

@jeff-pal ; vc achou alguma outra solução de contorno? testou com o encoding='ANSI' ?

victorbertoldo commented 3 years ago

Eu resolvi utilizando o encoding= 'cp437'

aphonsoar commented 3 years ago

@victorbertoldo, vc chegou a testar o ANSI ou foi direto pro cp437 ?

jeff-pal commented 3 years ago

Eu implementei a identificação de encoding/charset de arquivo (seguindo os padrões de encoding) , mas parece que alguns arquivos contém caracteres que não pertencem ao charset identificado. Veja esse caso:

image

Foi identificado que o encoding do arquivo destacado é Ascii, no entanto foi encontrado um carácter que não pode ser decodificado com esse charset. O byte 0xc3, por exemplo, representa o carácter à no padrão Unicode, o qual não existe na tabela Ascii.

Quando eu tendo com um valor arbitrário, seja Ansi, cp437 ou outro, não funciona para todos os arquivos.

jeff-pal commented 3 years ago

Embora o charset da minha lista de arquivos descompactados varie entre ascii e iso-8859-1, só consegui finalizar a inserção dos dados com iso-8859-1. Em alguns casos, o encoding do arquivo é identificado como ascii, mas encontra bytes que não podem ser decodificados com ascii, então tive que setar o encoding manualmente com iso-8859-1 para todas as leituras. Outro problema que tive foi com Null (_csv.error line contains null byte), o qual não consegui resolver pelo código, e acabei tendo que fazer manualmente, utilizando um comando linux (sed -i 's/\x0//g' FILE_NAME).

F.K03200$W.SIMPLES.CSV.D10612: ASCII
F.K03200$Z.D10612.CNAECSV: ISO-8859-1
F.K03200$Z.D10612.MOTICSV: ASCII
F.K03200$Z.D10612.MUNICCSV: ASCII
F.K03200$Z.D10612.NATJUCSV: ISO-8859-1
F.K03200$Z.D10612.PAISCSV: ISO-8859-1
F.K03200$Z.D10612.QUALSCSV: ISO-8859-1
K3241.K03200Y0.D10612.EMPRECSV: ASCII
K3241.K03200Y0.D10612.ESTABELE: ASCII
K3241.K03200Y0.D10612.SOCIOCSV: ASCII
K3241.K03200Y1.D10612.EMPRECSV: ISO-8859-1
K3241.K03200Y1.D10612.ESTABELE: ASCII
K3241.K03200Y1.D10612.SOCIOCSV: ASCII
K3241.K03200Y2.D10612.EMPRECSV: ASCII
K3241.K03200Y2.D10612.ESTABELE: ISO-8859-1
K3241.K03200Y2.D10612.SOCIOCSV: ASCII
K3241.K03200Y3.D10612.EMPRECSV: ISO-8859-1
K3241.K03200Y3.D10612.ESTABELE: ASCII
K3241.K03200Y3.D10612.SOCIOCSV: ASCII
K3241.K03200Y4.D10612.EMPRECSV: ASCII
K3241.K03200Y4.D10612.ESTABELE: unknown
K3241.K03200Y4.D10612.SOCIOCSV: ASCII
K3241.K03200Y5.D10612.EMPRECSV: ISO-8859-1
K3241.K03200Y5.D10612.ESTABELE: ASCII
K3241.K03200Y5.D10612.SOCIOCSV: ASCII
K3241.K03200Y6.D10612.EMPRECSV: ISO-8859-1
K3241.K03200Y6.D10612.ESTABELE: ASCII
K3241.K03200Y6.D10612.SOCIOCSV: ASCII
K3241.K03200Y7.D10612.EMPRECSV: ASCII
K3241.K03200Y7.D10612.ESTABELE: ASCII
K3241.K03200Y7.D10612.SOCIOCSV: ASCII
K3241.K03200Y8.D10612.EMPRECSV: ASCII
K3241.K03200Y8.D10612.ESTABELE: ASCII
K3241.K03200Y8.D10612.SOCIOCSV: ASCII
K3241.K03200Y9.D10612.EMPRECSV: ASCII
K3241.K03200Y9.D10612.ESTABELE: ASCII
K3241.K03200Y9.D10612.SOCIOCSV: ASCII
rodsguilherme commented 2 years ago

Eu estou utilizando o Fedora 34 e resolvi passando como encoding='latin1', o enconding como ANSI não funcionou também.

RWaiti commented 2 years ago

['cp437', 'cp720', 'cp737', 'cp775', 'cp850', 'cp852', 'cp855', 'cp858', 'cp860', 'cp861', 'cp862', 'cp863', 'cp865', 'cp866', 'cp869', 'cp1006', 'cp1125', 'cp1250', 'cp1251', 'cp1252', 'cp1254', 'cp1256', 'cp1257', 'cp1258', 'latin_1', 'iso8859_2', 'iso8859_4', 'iso8859_5', 'iso8859_7', 'iso8859_9', 'iso8859_10', 'iso8859_13', 'iso8859_14', 'iso8859_15', 'iso8859_16', 'koi8_r', 'koi8_u', 'kz1048', 'mac_cyrillic', 'mac_greek', 'mac_iceland', 'mac_latin2', 'mac_roman', 'mac_turkish', 'ptcp154']

Todos esses resultam em RangeIndex: 4753434 entries, 0 to 4753433 - total 30 columns Foi no arquivo - K3241.K03200Y1.D11113.ESTABELE Só verifiquei se passava ou não