Closed jeff-pal closed 2 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?
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
@jeff-pal ; vc achou alguma outra solução de contorno? testou com o encoding='ANSI'
?
Eu resolvi utilizando o encoding= 'cp437'
@victorbertoldo, vc chegou a testar o ANSI
ou foi direto pro cp437
?
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:
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.
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
Eu estou utilizando o Fedora 34 e resolvi passando como encoding='latin1'
, o enconding como ANSI
não funcionou também.
['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
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:Solução: a solução foi adicionar o parâmetro
engine='python'
em todas as chamadas para a funçãoread_csv()
: