Używam Python-2.6 CGI
skryptów, ale znalazłem ten błąd w dzienniku serwera podczas robienia json.dumps()
,
Traceback (most recent call last):
File "/etc/mongodb/server/cgi-bin/getstats.py", line 135, in <module>
print json.dumps(__getdata())
File "/usr/lib/python2.7/json/__init__.py", line 231, in dumps
return _default_encoder.encode(obj)
File "/usr/lib/python2.7/json/encoder.py", line 201, in encode
chunks = self.iterencode(o, _one_shot=True)
File "/usr/lib/python2.7/json/encoder.py", line 264, in iterencode
return _iterencode(o, 0)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xa5 in position 0: invalid start byte
Tutaj,
__getdata()
funkcja zwraca dictionary {}
.
Przed wysłaniem tego pytania skierowałem to pytanie jako SO.
AKTUALIZACJE
Poniższy wiersz szkodzi koderowi JSON,
now = datetime.datetime.now()
now = datetime.datetime.strftime(now, '%Y-%m-%dT%H:%M:%S.%fZ')
print json.dumps({'current_time': now}) // this is the culprit
Mam tymczasową poprawkę
print json.dumps( {'old_time': now.encode('ISO-8859-1').strip() })
Ale nie jestem pewien, czy to właściwy sposób.
dict
?dict
malist, dict, python timestamp value
__getdata
. Nie wiem, dlaczego otrzymujesz znak, którego nie można odszyfrować. Możesz spróbować wymyślić łatki na dykt, aby działały, ale najczęściej są to po prostu prośby o więcej problemów później. Spróbowałbym wydrukować dyktando, aby zobaczyć, gdzie jest znak spoza ASCII. Następnie dowiedz się, w jaki sposób to pole zostało obliczone / ustawione i stamtąd pracuj wstecz.Odpowiedzi:
Błąd jest spowodowany tym, że w słowniku znajduje się jakiś znak inny niż ASCII i nie można go zakodować / zdekodować. Prostym sposobem uniknięcia tego błędu jest zakodowanie takich ciągów za pomocą
encode()
funkcji w następujący sposób (jeślia
jest to ciąg ze znakiem innym niż ASCII):źródło
Zmieniłem to po prostu definiując inny pakiet kodeków w
read_csv()
poleceniu:encoding = 'unicode_escape'
Na przykład:
źródło
pandas
Wypróbuj poniższy fragment kodu:
źródło
r
zamiastrb
. dzięki za przypomnienie o dodaniub
!open
funkcja ma „r” jako tryb tylko do odczytu.rb
oznacza tryb odczytu binarnego.Twój ciąg zawiera niezakodowany
ascii
znak.Brak możliwości dekodowania za pomocą
utf-8
może się zdarzyć, jeśli musisz użyć innego kodowania w swoim kodzie. Na przykład:W takim przypadku kodowanie jest
windows-1252
takie, że musisz to zrobić:Teraz, gdy już to zrobiłeś
Unicode
, możesz bezpiecznie kodować doutf-8
.źródło
Podczas czytania
csv
dodałem metodę kodowania:źródło
Ustaw domyślny koder u góry kodu
źródło
Od 2018-05 jest to obsługiwane bezpośrednio
decode
, przynajmniej w przypadku Pythona 3 .Używam poniższego fragmentu kodu
invalid start byte
iinvalid continuation byte
wpisuję błędy. Dodanieerrors='ignore'
naprawiło to dla mnie.źródło
Zainspirowany @aaronpenne i @Soumyaansh
źródło
To rozwiązanie zadziałało dla mnie:
źródło
Proste rozwiązanie:
źródło
Poniższy wiersz szkodzi koderowi JSON,
Mam tymczasową poprawkę
Oznaczanie tego jako poprawnego jako tymczasowa poprawka (nie jestem pewien).
źródło
Jeśli powyższe metody nie działają dla Ciebie, możesz chcieć zmienić kodowanie samego pliku csv.
Korzystanie z programu Excel:
Korzystanie z Notatnika:
Robiąc to, powinieneś być w stanie importować pliki csv bez napotkania UnicodeCodeError.
źródło
Po wypróbowaniu wszystkich wyżej wymienionych obejść, jeśli nadal generuje ten sam błąd, możesz spróbować wyeksportować plik jako CSV (drugi raz, jeśli już masz). Szczególnie jeśli używasz scikit Learn, najlepiej zaimportować zbiór danych jako plik CSV.
Spędziłem razem godziny, a rozwiązanie było takie proste. Wyeksportuj plik jako plik CSV do katalogu, w którym jest zainstalowany program Anaconda lub narzędzia klasyfikatora, i spróbuj.
źródło
Możesz użyć dowolnego standardowego kodowania określonego zastosowania i danych wejściowych.
utf-8
jest wartością domyślną.iso8859-1
jest również popularny w Europie Zachodniej.na przykład:
bytes_obj.decode('iso8859-1')
zobacz: docs
źródło
Zamiast szukać sposobów na zdekodowanie a5 (jenów
¥
) lub 96 (półpauza–
), powiedz MySQL, że twój klient jest zakodowany jako „latin1”, ale chcesz, aby w bazie danych znajdował się „utf8”.Zobacz szczegóły w Problemie ze znakami UTF-8; to, co widzę, nie jest tym, co zapisałem
źródło