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>`
Respostas:
O arquivo em questão não está usando a
CP1252
codificação. Está usando outra codificação. Qual você tem que descobrir por si mesmo. Os comuns sãoLatin-1
eUTF-8
. Como 0x90 na verdade não significa nadaLatin-1
,UTF-8
(onde 0x90 é um byte de continuação) é mais provável.Você especifica a codificação ao abrir o arquivo:
fonte
io
módulo:io.open(filename,encoding="utf8")
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 usandofrom geotext import GeoText
. Por favor, sugira uma solução.Só para adicionar no caso de
file = open(filename, encoding="utf8")
não funcionar tentefile = open(filename, errors='ignore')
fonte
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 Text
tem um comando para exibir a codificação, se tiver sido definido ...View
->Show Console
(ou Ctrl+ `)view.encoding()
e espere o melhor (não consegui nada,Undefined
mas talvez você tenha mais sorte ...)fonte
:set fileencoding
( a partir deste link )view.encoding()
.Como alternativa, se você não precisar decodificar o arquivo, como carregar o arquivo em um site
open(filename, 'rb')
,. r = leitura, b = bináriofonte
TLDR? Tentar:
file = open(filename, encoding='cp437)
Por quê? Quando se usa:
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:
Outra solução alternativa é usar:
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):
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).
fonte
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"
fonte
Pare de desperdiçar seu tempo, basta adicionar o seguinte
encoding="cp437"
eerrors='ignore'
ao seu código em leitura e gravação:Boa Sorte Vá com Deus
fonte
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
fonte