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>`
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")
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óbujfile = open(filename, errors="ignore")
, jeśli chcesz usunąć niepotrzebne znaki.
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...
- idź do
View
->Show Console
(lub Ctrl+`)
- wpisz w pole na dole
view.encoding()
i miej nadzieję na najlepsze (nie udało mi się uzyskać niczego pozaUndefined
ale może będziesz miał więcej szczęścia...)
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
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)
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ć).
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
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"
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.
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
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