Próbuję uzyskać program w języku Python 3 do wykonywania pewnych operacji przy użyciu pliku tekstowego wypełnionego informacjami. Jednak podczas próby odczytania pliku pojawia się następujący błąd:
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>`
Odpowiedzi:
Plik, o którym mowa, nie korzysta z
CP1252
kodowania. Używa innego kodowania. Który musisz sam wymyślić. Typowe sąLatin-1
iUTF-8
. Ponieważ 0x90 tak naprawdę nic nie znaczyLatin-1
,UTF-8
(gdzie 0x90 jest bajtem kontynuacji) jest bardziej prawdopodobne.Określasz kodowanie podczas otwierania pliku:
źródło
io
moduł:io.open(filename,encoding="utf8")
filename = "C:\Report.txt" with open(filename,encoding ="utf8") as my_file: text = my_file.read() print(text)
nawet po użyciu otrzymuję ten sam błąd. Próbowałem też z innym kodowaniem, ale wszystko na próżno. W tym kodzie również używamfrom geotext import GeoText
. Proszę zaproponować rozwiązanie.Tylko dodać, jeśli
file = open(filename, encoding="utf8")
nie działa spróbujfile = open(filename, errors='ignore')
źródło
Jako rozszerzenie odpowiedzi @ LennartRegebro :
Jeśli nie możesz powiedzieć, jakiego kodowania używa Twój plik, a powyższe rozwiązanie nie działa (nie jest
utf8
), a znalazłeś się tylko w zgadywaniu - istnieją narzędzia online , za pomocą których można zidentyfikować, jakie to kodowanie. Nie są idealne, ale zwykle działają dobrze. Po ustaleniu kodowania powinieneś być w stanie użyć powyższego rozwiązania.EDYCJA: (Skopiowane z komentarza)
Dość popularny edytor tekstowy
Sublime Text
ma polecenie wyświetlania kodowania, jeśli zostało ustawione ...View
->Show Console
(lub Ctrl+ `)view.encoding()
iUndefined
miej nadzieję na najlepsze (nie udało mi się nic dostać, ale może będziesz mieć więcej szczęścia ...)źródło
:set fileencoding
( z tego linku )view.encoding()
.Alternatywnie, jeśli nie trzeba dekodować pliku, takie jak przesyłanie plików do serwisów
open(filename, 'rb')
. r = odczyt, b = binarnyźródło
TLDR? Próbować:
file = open(filename, encoding='cp437)
Dlaczego? Gdy jedno użycie:
Python zakłada, że plik używa tej samej strony kodowej co bieżące środowisko (cp1252 w przypadku postu otwierającego) i próbuje zdekodować go do własnego domyślnego UTF-8. Jeśli plik zawiera znaki o wartościach niezdefiniowanych na tej stronie kodowej (np. 0x90), otrzymujemy błąd UnicodeDecodeError. Czasami nie znamy kodowania pliku, czasem kodowanie pliku może być nieobsługiwane przez Python (np. Cp790), czasem plik może zawierać kodowanie mieszane.
Jeśli takie znaki nie są potrzebne, można zdecydować o ich zastąpieniu znakami zapytania:
Innym obejściem jest użycie:
Znaki pozostaną nienaruszone, ale inne błędy również zostaną zamaskowane.
Całkiem dobrym rozwiązaniem jest określenie kodowania, ale nie kodowania (jak cp1252), ale takiego, w którym zdefiniowano WSZYSTKIE znaki (jak cp437):
Strona kodowa 437 to oryginalne kodowanie DOS. Wszystkie kody są zdefiniowane, więc nie ma błędów podczas odczytu pliku, żadnych błędów jest maskowanych, znaki są zachowywane (niezupełnie pozostawione nienaruszone, ale nadal możliwe do odróżnienia).
źródło
Dla osób pracujących w Anaconda w systemie Windows miałem ten sam problem. Notepad ++ pomóż mi go rozwiązać.
Otwórz plik w Notepad ++. W prawym dolnym rogu pokaże ci bieżące kodowanie pliku. W górnym menu obok „Widok” znajdź „Kodowanie”. W „Kodowaniu” przejdź do „zestawów znaków” i tam wraz z pacjentem szukaj kodowania, którego potrzebujesz. W moim przypadku kodowanie „Windows-1252” znaleziono w „Zachodnioeuropejskim”
źródło
Przestań marnować czas, po prostu dodaj następujące elementy
encoding="cp437"
ierrors='ignore'
do kodu zarówno w trybie odczytu, jak i zapisu:Życzenia powodzenia
źródło
dla mnie zmiana kodowania Mysql na taki sam jak mój kod pomogła w rozwiązaniu problemu. `photo = open ('pic3.png', kodowanie = latin1), silny tekst
źródło