Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Closed
jeff-pal opened this issue Jun 18, 2021 · 9 comments

Comments

@jeff-pal
Copy link
Contributor

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
Copy link
Owner

@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
Copy link
Contributor Author

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
Copy link
Owner

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

@victorbertoldo
Copy link

Eu resolvi utilizando o encoding= 'cp437'

@aphonsoar
Copy link
Owner

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

@jeff-pal
Copy link
Contributor Author

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
Copy link
Contributor Author

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
Copy link

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

@RWaiti
Copy link

RWaiti commented Dec 27, 2021

['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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants