Estou executando um programa que está processando 30.000 arquivos semelhantes. Um número aleatório deles está parando e produzindo esse erro ...
File "C:\Importer\src\dfman\importer.py", line 26, in import_chr
data = pd.read_csv(filepath, names=fields)
File "C:\Python33\lib\site-packages\pandas\io\parsers.py", line 400, in parser_f
return _read(filepath_or_buffer, kwds)
File "C:\Python33\lib\site-packages\pandas\io\parsers.py", line 205, in _read
return parser.read()
File "C:\Python33\lib\site-packages\pandas\io\parsers.py", line 608, in read
ret = self._engine.read(nrows)
File "C:\Python33\lib\site-packages\pandas\io\parsers.py", line 1028, in read
data = self._reader.read(nrows)
File "parser.pyx", line 706, in pandas.parser.TextReader.read (pandas\parser.c:6745)
File "parser.pyx", line 728, in pandas.parser.TextReader._read_low_memory (pandas\parser.c:6964)
File "parser.pyx", line 804, in pandas.parser.TextReader._read_rows (pandas\parser.c:7780)
File "parser.pyx", line 890, in pandas.parser.TextReader._convert_column_data (pandas\parser.c:8793)
File "parser.pyx", line 950, in pandas.parser.TextReader._convert_tokens (pandas\parser.c:9484)
File "parser.pyx", line 1026, in pandas.parser.TextReader._convert_with_dtype (pandas\parser.c:10642)
File "parser.pyx", line 1046, in pandas.parser.TextReader._string_convert (pandas\parser.c:10853)
File "parser.pyx", line 1278, in pandas.parser._string_box_utf8 (pandas\parser.c:15657)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xda in position 6: invalid continuation byte
A origem / criação desses arquivos são todos do mesmo local. Qual é a melhor maneira de corrigir isso para prosseguir com a importação?
cp1252
pode ser preferíveliso-8859-1
.pd.read_csv('immigration.csv', encoding = "ISO-8859-1", engine='python')
trabalhou para mimANSI
. Para descobrir isso, eu abri o csvnotepad
e clique emsave as
, lá mostra a codificação ao lado do botão Salvar.Soluções mais simples:
Solução alternativa:
Em seguida, você pode ler seu arquivo como de costume:
e os outros tipos diferentes de codificação são:
fonte
encoding='iso-8859-1'
, em vez disso,engine='python'
lança_csv.Error: field larger than field limit (131072)
.O Pandas permite especificar a codificação, mas não permite ignorar erros para não substituir automaticamente os bytes incorretos. Portanto, não existe um tamanho único para todos os métodos, mas de maneiras diferentes, dependendo do caso de uso real.
Você conhece a codificação e não há erro de codificação no arquivo. Ótimo: você só precisa especificar a codificação:
Você não quer ser incomodado com perguntas de codificação e deseja que esse maldito arquivo seja carregado, independentemente de alguns campos de texto contiverem lixo. Ok, você só precisa usar a
Latin1
codificação porque aceita qualquer byte possível como entrada (e converte-o no caractere unicode do mesmo código):Você sabe que a maior parte do arquivo é gravada com uma codificação específica, mas também contém erros de codificação. Um exemplo do mundo real é um arquivo UTF8 que foi editado com um editor não utf8 e que contém algumas linhas com uma codificação diferente. O Pandas não tem provisão para um processamento de erro especial, mas a
open
função Python possui (assumindo Python3) eread_csv
aceita um arquivo como objeto. O parâmetro de erros típicos a ser usado aqui é o'ignore'
que apenas suprime os bytes incorretos ou (IMHO melhor)'backslashreplace'
que substitui os bytes incorretos pela sequência de escape com barra invertida do Python:fonte
Depois de executar este código, você encontrará a codificação de 'filename.csv' e, em seguida, executará o código da seguinte maneira
ai está
fonte
No meu caso, um arquivo possui
USC-2 LE BOM
codificação, de acordo com o Notepad ++. Isto éencoding="utf_16_le"
para python.Espero que ajude a encontrar uma resposta um pouco mais rápida para alguém.
fonte
No meu caso, isso funcionou para o python 2.7:
E para python 3, apenas:
fonte
Tente especificar o engine = 'python'. Funcionou para mim, mas ainda estou tentando descobrir o porquê.
fonte
Estou postando uma resposta para fornecer uma solução atualizada e uma explicação de por que esse problema pode ocorrer. Digamos que você esteja obtendo esses dados de um banco de dados ou pasta de trabalho do Excel. Se você tiver caracteres especiais como
La Cañada Flintridge city
, bem, a menos que esteja exportando os dados usandoUTF-8
codificação, você introduzirá erros.La Cañada Flintridge city
vai se tornarLa Ca\xf1ada Flintridge city
. Se você estiver usandopandas.read_csv
sem nenhum ajuste nos parâmetros padrão, verá o seguinte erroFelizmente, existem algumas soluções.
Opção 1 , corrija a exportação. Certifique-se de usar a
UTF-8
codificação.Opção 2 , se corrigir o problema de exportação não está disponível para você, e você precisa usar
pandas.read_csv
, certifique-se de incluir os seguintes paramters,engine='python'
. Por padrão, o pandas usa oengine='C'
que é ótimo para ler grandes arquivos limpos, mas falhará se surgir algo inesperado. Na minha experiência, a configuraçãoencoding='utf-8'
nunca corrigiu issoUnicodeDecodeError
. Além disso, você não precisa usarerrors_bad_lines
, no entanto, isso ainda é uma opção se você REALMENTE precisar.Opção 3: solução é minha solução preferida pessoalmente. Leia o arquivo usando o Python vanilla.
Espero que isso ajude as pessoas a encontrar esse problema pela primeira vez.
fonte
Lutou um pouco com isso e pensei em postar essa pergunta, já que é o primeiro resultado da pesquisa. Adicionando a
encoding="iso-8859-1"
tag aos pandasread_csv
não funcionou, nem qualquer outra codificação, continuou fornecendo um UnicodeDecodeError.Se você estiver passando um identificador de arquivo,
pd.read_csv(),
precisará colocar oencoding
atributo no arquivo aberto, não emread_csv
. Óbvio em retrospectiva, mas um erro sutil para rastrear.fonte
Por favor, tente adicionar
Isso vai ajudar. Trabalhou para mim. Além disso, verifique se você está usando o delimitador e os nomes de coluna corretos.
Você pode começar carregando apenas 1000 linhas para carregar o arquivo rapidamente.
fonte
Essa resposta parece ser a solução para problemas de codificação de CSV. Se você está tendo um problema de codificação estranho com o cabeçalho desta maneira:
Então você tem um caractere de marca de ordem de byte (BOM) no início do seu arquivo CSV. Esta resposta soluciona o problema:
Python leia csv - BOM incorporada na primeira chave
A solução é carregar o CSV com
encoding="utf-8-sig"
:Espero que isso ajude alguém.
fonte
Estou postando uma atualização para este tópico antigo. Encontrei uma solução que funcionou, mas requer a abertura de cada arquivo. Abri meu arquivo csv no LibreOffice, escolha Salvar como> editar configurações de filtro. No menu suspenso, escolhi a codificação UTF8. Então eu adicionei
encoding="utf-8-sig"
aodata = pd.read_csv(r'C:\fullpathtofile\filename.csv', sep = ',', encoding="utf-8-sig")
.Espero que isso ajude alguém.
fonte
Estou com problemas para abrir um arquivo CSV em chinês simplificado baixado de um banco online, tentei
latin1
, tenteiiso-8859-1
, tenteicp1252
, tudo sem sucesso.Mas
pd.read_csv("",encoding ='gbk')
simplesmente faz o trabalho.fonte
Estou usando o notebook Jupyter. E no meu caso, estava mostrando o arquivo no formato errado. A opção 'codificação' não estava funcionando. Então, eu salvo o csv no formato utf-8, e ele funciona.
fonte
Tente o seguinte:
Parece que ele cuidará da codificação sem expressá-la explicitamente através de argumentos
fonte
Verifique a codificação antes de passar para os pandas. Isso vai te atrapalhar, mas ...
No python 3.7
fonte
Outra questão importante que eu enfrentei que resultou no mesmo erro foi:
fonte
read_excel
em pandas.Você pode tentar isso.
fonte