UnicodeDecodeError: o codec 'charmap' não pode decodificar o byte X na posição Y: mapeamentos de caracteres para <não definido>

550

Estou tentando obter um programa Python 3 para fazer algumas manipulações com um arquivo de texto preenchido com informações. No entanto, ao tentar ler o arquivo, recebo o seguinte erro:

 Traceback (most recent call last):  
     File "SCRIPT LOCATION", line NUMBER, in <module>  
     `text = file.read()`  
     File "C:\Python31\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 0x90 in position 2907500: character maps to `<undefined>`  
Eden Crow
fonte
2
Para o mesmo erro estes solução tem me ajudado, solução de erro charmap
Shubham Sharma
2
Consulte Processando arquivos de texto no Python 3 para entender por que você recebe esse erro.
Andreas Haferburg

Respostas:

961

O arquivo em questão não está usando a CP1252codificação. Está usando outra codificação. Qual você tem que descobrir por si mesmo. Os comuns são Latin-1e UTF-8. Como 0x90 na verdade não significa nada Latin-1, UTF-8(onde 0x90 é um byte de continuação) é mais provável.

Você especifica a codificação ao abrir o arquivo:

file = open(filename, encoding="utf8")
Lennart Regebro
fonte
19
Legal, eu tive esse problema com algum código Python 2.7 que tentei executar no Python 3.4. Latin-1 funcionou para mim!
precisa
2
se você estiver usando o Python 2.7 e obtendo o mesmo erro, tente o iomódulo:io.open(filename,encoding="utf8")
christopherlovell
9
@ 1vand1ng0: é claro que o Latin-1 funciona; funcionará para qualquer arquivo, independentemente da codificação real do arquivo. Isso ocorre porque todos os 256 valores de bytes possíveis em um arquivo têm um ponto de código Latin-1 para mapear, mas isso não significa que você obtenha resultados legíveis! Se você não conhece a codificação, abrir o arquivo no modo binário pode ser melhor do que assumir o Latin-1.
Martijn Pieters
1
É unicode por padrão, mas unicode não é uma codificação. Regebro.wordpress.com/2011/03/23/…
Lennart Regebro
1
filename = "C:\Report.txt" with open(filename,encoding ="utf8") as my_file: text = my_file.read() print(text)mesmo depois de usar isso, estou recebendo o mesmo erro. Eu também tentei com outra codificação, mas tudo em vão. Neste código também estou usando from geotext import GeoText. Por favor, sugira uma solução.
Salah
47

Só para adicionar no caso de file = open(filename, encoding="utf8")não funcionar tentefile = open(filename, errors='ignore')

Declan Nnadozie
fonte
Muito obrigado - vou tentar. Existem alguns caracteres inválidos em partes dos arquivos que não me interessam.
Stephen Nutt
6
Aviso: Isso resultará em perda de dados quando caracteres desconhecidos forem encontrados (o que pode ser bom dependendo da sua situação).
Hans Goldman
34

Como uma extensão da resposta de @ LennartRegebro :

Se você não pode dizer qual codificação seu arquivo usa e a solução acima não funciona (não é utf8) e você se limitou a adivinhar - existem ferramentas on-line que você pode usar para identificar qual é a codificação. Eles não são perfeitos, mas geralmente funcionam muito bem. Depois de descobrir a codificação, você poderá usar a solução acima.

EDIT: (copiado do comentário)

Um editor de texto bastante popular Sublime Texttem um comando para exibir a codificação, se tiver sido definido ...

  1. Vá para View-> Show Console(ou Ctrl+ `)

insira a descrição da imagem aqui

  1. Digite o campo na parte inferior view.encoding()e espere o melhor (não consegui nada, Undefinedmas talvez você tenha mais sorte ...)

insira a descrição da imagem aqui

Matas Vaitkevicius
fonte
2
Alguns editores de texto também fornecerão essas informações. Eu sei que com vim você pode obter esta via :set fileencoding( a partir deste link )
PaxRomana99
3
Sublime Text, also - abra o console e digite view.encoding().
JimmidyJoo
Como alternativa, você pode abrir seu arquivo com o bloco de notas. 'Save As' e você verá um menu suspenso com a codificação usada
don_Gunner94
9

Como alternativa, se você não precisar decodificar o arquivo, como carregar o arquivo em um site open(filename, 'rb'),. r = leitura, b = binário

Kyle Parisi
fonte
Obrigado que foi o caso para o meu problema
shahin gh
6

TLDR? Tentar:file = open(filename, encoding='cp437)

Por quê? Quando se usa:

file = open(filename)
text = file.read()

O Python assume que o arquivo usa a mesma página de código do ambiente atual (cp1252 no caso da postagem de abertura) e tenta decodificá-lo para seu próprio UTF-8 padrão. Se o arquivo contiver caracteres de valores não definidos nesta página de códigos (como 0x90), obteremos UnicodeDecodeError. Às vezes, não sabemos a codificação do arquivo, às vezes a codificação do arquivo pode não ser tratada pelo Python (como, por exemplo, o cp790), às vezes o arquivo pode conter codificações mistas.

Se esses caracteres não forem necessários, pode-se decidir substituí-los por pontos de interrogação, com:

file = open(filename, errors='replace')

Outra solução alternativa é usar:

file = open(filename, errors='ignore')

Os caracteres são deixados intactos, mas outros erros também serão ocultados.

A solução bastante boa é especificar a codificação, mas não nenhuma (como cp1252), mas aquela com TODOS os caracteres definidos (como cp437):

file = open(filename, encoding='cp437')

A página de código 437 é a codificação DOS original. Todos os códigos são definidos, portanto, não há erros durante a leitura do arquivo, nenhum erro é ocultado, os caracteres são preservados (não completamente intactos, mas ainda distinguíveis).

rha
fonte
1
Uau, isso é você. Esta é a única decodificação que funciona para mim.
Kowalski
1

Para aqueles que trabalham no Anaconda no Windows, tive o mesmo problema. O Notepad ++ me ajuda a resolvê-lo.

Abra o arquivo no Notepad ++. No canto inferior direito, será exibida a codificação atual do arquivo. No menu superior, ao lado de "Exibir", localize "Codificação". Em "Codificação", vá para "conjuntos de caracteres" e lá, com paciência, procure o contexto que você precisa. No meu caso, a codificação "Windows-1252" foi encontrada em "Europa Ocidental"

Antoni
fonte
1

Pare de desperdiçar seu tempo, basta adicionar o seguinte encoding="cp437"e errors='ignore'ao seu código em leitura e gravação:

open('filename.csv', encoding="cp437", errors='ignore')
open(file_name, 'w', newline='', encoding="cp437", errors='ignore')

Boa Sorte Vá com Deus

E.Zolduoarrati
fonte
Com certeza, senhor. Entendido. Sem tempo perdido. Obrigado. Gostaria de uma xícara de café ou um bom vinho?
Pramesh Bajracharya
0

para mim, alterar o caractere Mysql da mesma forma que o meu código ajudou a resolver a solução. `photo = open ('pic3.png', codificação = latin1), texto forte insira a descrição da imagem aqui

Piyush raj
fonte