UnicodeDecodeError: kodek 'charmap' nie może dekodować bajtu X w pozycji Y: mapy znaków do

Próbuję nakłonić program Pythona 3 do wykonywania pewnych manipulacji z plikiem tekstowym wypełnionym informacjami. Jednak podczas próby odczytania pliku dostaję 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>`  
Author: eng.mrgh, 2012-02-10

9 answers

Dany plik nie używa kodowania CP1252. Używa innego kodowania. Który musisz sam wymyślić. Typowe to Latin-1 i UTF-8. Ponieważ 0x90 właściwie nic nie znaczy w Latin-1, UTF-8 (Gdzie 0x90 jest bajtem kontynuacji) jest bardziej prawdopodobne.

Określasz kodowanie po otwarciu pliku:

file = open(filename, encoding="utf8")
 1150
Author: Lennart Regebro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-05 13:05:51

Jeśli file = open(filename, encoding="utf8") nie działa, spróbuj
file = open(filename, errors="ignore"), jeśli chcesz usunąć niepotrzebne znaki.

 57
Author: Declan Nnadozie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-01-29 08:40:51

Jako rozszerzenie do @LennartRegebro ' s answer :

Jeśli nie wiesz, jakiego kodowania używa Twój plik, a powyższe rozwiązanie nie działa (nie jest to utf8) i znalazłeś się jedynie w zgadywaniu - istnieją narzędzia online , których możesz użyć, aby zidentyfikować kodowanie, które to jest. Nie są idealne, ale zazwyczaj działają dobrze. Po ustaleniu kodowania powinieneś być w stanie użyć powyższego rozwiązania.

EDIT: (skopiowane z komentarza)

Całkiem popularny edytor tekstu Sublime Text ma polecenie wyświetlania kodowania, jeśli zostało ustawione...

  1. idź do View -> Show Console (lub Ctrl+`)

Tutaj wpisz opis obrazka

  1. wpisz w pole na dole view.encoding() i miej nadzieję na najlepsze (nie udało mi się uzyskać niczego poza Undefined ale może będziesz miał więcej szczęścia...)

Tutaj wpisz opis obrazka

 35
Author: Matas Vaitkevicius,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-09-09 19:25:30

Alternatywnie, jeśli nie musisz dekodować pliku, np. wgrywać go na stronę internetową, open(filename, 'rb')

Gdzie r = czytanie, b = binary

 23
Author: Kyle Parisi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-10-04 12:53:35

TLDR? Spróbuj: file = open(filename, encoding='cp437)

Dlaczego? Przy jednym użyciu:
file = open(filename)
text = file.read()

Python zakłada, że plik używa tej samej strony kodowej co obecne środowisko (cp1252 w przypadku otwierającego się posta) i próbuje dekodować go do własnego domyślnego UTF-8. Jeżeli plik zawiera znaki wartości nie zdefiniowanych na tej stronie kodowej (np. 0x90) otrzymujemy UnicodeDecodeError. Czasami nie znamy kodowania pliku, czasami kodowanie pliku może być nieskomplikowane przez Pythona( jak np. cp790), czasami plik może zawierać kodowanie mieszane.

Jeśli takie znaki są niepotrzebne, można zdecydować się na zastąpienie ich znakami zapytania, z:

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

Innym obejściem jest użycie:

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

Znaki pozostają nienaruszone, ale inne błędy również zostaną zamaskowane.

Dość dobrym rozwiązaniem jest określenie kodowania, jednak nie żadnego kodowania (jak cp1252), ale takiego, które ma zdefiniowane wszystkie znaki (jak cp437): {]}

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

Codepage 437 jest oryginalnym kodowaniem DOS. Wszystkie kody są zdefiniowane, więc nie ma żadnych błędów podczas odczytu pliku, żadne błędy nie są maskowane, znaki są zachowane(nie do końca nienaruszone, ale nadal można je odróżnić).

 13
Author: rha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-11-08 18:14:33

Przestań marnować swój czas, po prostu dodaj następujące encoding="cp437" i errors='ignore' do kodu zarówno w odczycie, jak i w zapisie:

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

Godspeed

 4
Author: E.Zolduoarrati,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-01 21:54:36

Dla osób pracujących w Anakondzie w Windows miałem ten sam problem. Notepad++ pomóż mi go rozwiązać.

Otwórz plik w Notepad++. W prawym dolnym rogu wyświetli Ci kodowanie bieżącego pliku. W górnym menu obok "Widok" znajdź "kodowanie". W "Kodowanie" przejdź do "zestawy znaków" i tam z patiente poszukaj kodowania, którego potrzebujesz. W moim przypadku kodowanie "Windows-1252" zostało znalezione pod "zachodnioeuropejski"

 2
Author: Antoni,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-09-01 05:36:10

Zanim zastosujesz sugerowane rozwiązanie, możesz sprawdzić, jaki jest znak Unicode, który pojawił się w Twoim pliku (i w dzienniku błędów), w tym przypadku 0x90: https://unicodelookup.com/#0x90/1 (lub bezpośrednio na stronie Konsorcjum Unicode http://www.unicode.org/charts / by searching 0x0090)

A następnie rozważ usunięcie go z pliku.

 1
Author: hanna,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-08-06 16:29:33

Dla mnie zmiana kodowania znaków Mysql tak samo jak mój kod pomogła uporządkować rozwiązanie. 'photo=open ('pic3.png", kodowanie = latin1), mocny tekst Tutaj wpisz opis obrazka

 0
Author: Piyush raj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-02-04 05:45:39