2013-08-27 6 views
9

Jako projekt, który pomoże mi w nauczeniu się Pythona, robię przeglądarkę CMD w Reddit przy użyciu danych json (na przykład www.reddit.com/all/ .json). Kiedy pojawiają się określone posty i próbuję je wydrukować (to zakładam, że powoduje błąd), pojawia się ten błąd:Nie można wydrukować znaku ' u2019' w języku Python z obiektu JSON

Traceback (ostatnie ostatnie połączenie): Plik "C: \ Users \ nsaba \ Desktop \ reddit_viewer.py ", wiersz 33, w print ("% d. (% d)% s \ n "% (i + 1, obj [" dane "] [" wynik "], obj [" dane "] [ 'tYTUŁ']))

pliku "C: \ Python33 \ lib \ kodowania \ cp437.py", wiersz 19, do kodowania codecs.charmap_encode powrotnej (wkładu, self.errors, encoding_map) [0] UnicodeEncodeError: kodek 'charmap' nie może kodować znaku '\ u2019' na pozycji 32: mapa znaków do

Oto gdzie obsłużyć dane:

request = urllib.request.urlopen(url) 
content = request.read().decode('utf-8') 
jstuff = json.loads(content) 

Linia używam, aby wydrukować dane wymienione w błędzie powyżej:

print ("%d. (%d) %s\n" % (i+1, obj['data']['score'], obj['data']['title'])) 

Może ktoś sugerują, gdzie może być nie tak?

+0

Problem prawie na pewno nie ma nic wspólnego z JSON-em ani z żadnym innym elementem kodu. Spróbuj po prostu 'print ('\ u2019')' i sprawdź, czy pojawi się ten sam błąd. Jeśli tak, problem polega na tym, że twój terminal ("skrzynka DOS") nie jest skonfigurowany do poprawnego działania wyjścia Unicode, i to jest to, co musisz naprawić. – abarnert

+0

Tak, masz rację. Powodem dodatkowych danych jest to, że nauczyłem się zadawać pytania, biorąc pod uwagę informacje, które mam, a nie to, co myślę, że może być. –

+1

Ale powinieneś opublikować minimalny kompletny przykład demonstrujący twój problem. Właśnie o to chodzi [SSCCE] (http://sscce.org). Jeśli 'print ('\ u2019')' wystarcza, aby to zademonstrować, każdy bardziej skomplikowany przykład po prostu poprowadzi ludzi w poszukiwaniu dzikich gonitw. Jeśli się martwisz, ludzie mogą zapytać "Dlaczego chcesz wydrukować tę postać?", Możesz dodać kontekst, który to wyjaśnia ... ale mimo to, poprowadź prawdziwy problem. – abarnert

Odpowiedz

18

Jest prawie pewne, że problemu nie ma nic wspólnego z kodem masz pokazane i może być reprodukowana w jednym wierszu:

print(u'\2019') 

Jeśli zestaw znaków twój terminal nie obsługuje U + 2019 (lub jeśli Python jest zdezorientowany tym, jaki zestaw znaków używa twój terminal), nie ma możliwości jego wydrukowania. Nie ma znaczenia, czy pochodzi z JSON czy gdziekolwiek indziej.

Terminal Windows (nazywany również "monitem DOS" lub "okienkiem cmd") jest zwykle skonfigurowany dla zestawu znaków, takiego jak cp1252, który zna tylko około 256 z 110000 znaków, i nic nie może zrobić Python bez poważnej zmiany do implementacji językowej. *

Zobacz artykuł na Wiki Python na stronie PrintFails, aby uzyskać szczegółowe informacje, obejścia i łącza do dodatkowych informacji. Istnieje również kilkaset duplikatów tego problemu na SO (chociaż wiele z nich będzie specyficznych dla Pythona 2.x, nie wspominając o tym).


* Windows ma cały oddzielny zestaw funkcji API do drukowania UTF-16 do terminalu, tak Python mógł wykryć, że stdout jest terminal Windows, a jeśli tak kodowania UTF-16 i zamiast wykorzystywać specjalne API kodowania do zestawu znaków terminala i używania standardowych. Ale to powoduje wiele różnych problemów (np. Różne sposoby drukowania do stdout wychodzi z synchronizacji). Dyskutowano o wprowadzaniu tych zmian, ale nawet gdyby wszyscy się zgodzili, a łatka została napisana jutro, to i tak nie pomogłoby ci, dopóki nie zostanie uaktualniona do jakiejkolwiek przyszłej wersji Pythona, do której została dodana ...

+0

Przepraszamy za dupe. Rozejrzę się po zasobach, które dostarczyłeś. –

+3

@ N-Saba: Trudno powiedzieć, że to dup, ponieważ nie jest jasne, czego szukać, dopóki nie poznałeś przynajmniej połowy odpowiedzi ... – abarnert

+0

@ N-Saba, wiem, że to stary wątek, ale powinieneś oznaczyć to jako odpowiedź, jeśli odpowiedziała na twoje pytanie (ja to zrobił). – ivan7707

0

Ustawiłem IDLE (Python Shell) i domyślna czcionka Window CMD do Lucida Console (czcionka obsługiwana przez utf-8) i tego typu błędy zniknęły; i już nie zobaczyć pudełka [] [] [] [] [] [] [] []

:)

0

@ N-Saba, jaka jest ciąg znaków, który powoduje błąd zostać wyrzucony? W moim przypadku testowym wygląda to na błąd specyficzny dla wersji w pythonie 2.7.3.

W paszy ja parsowania, „Tytuł” ​​pole miał następującą wartość:

u'title': u'Intel\u2019s Sharp-Eyed Social Scientist' 

uzyskać oczekiwany prawego apostrofu char gdy zgłoszę jednej z nich, w python 2.7.6 .

python -c "print {u'title': u'Intel\u2019s Sharp-Eyed Social Scientist'}['title']" 
Intel’s Sharp-Eyed Social Scientist 

W 2.7.3, pojawia się błąd, chyba że kodować wartości że ciągniętych przez nazwa_klucza.

print {u'title': u'Intel\u2019s Sharp-Eyed Social Scientist'}['title'] 
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2019' in position 5: ordinal not in range(128) 
print {u'title': u'Intel\u2019s Sharp-Eyed Social Scientist'}['title'].encode('utf-8', 'replace') 
Intel’s Sharp-Eyed Social Scientist 

fwiw, polecenie polecenia @abamert ("\ u201") drukuje "9". Myślę, że zamierzony kod został wydrukowany (u "\ u2019").

+0

'U' nie jest wymagane w Pythonie 3, ponieważ domyślnie jest to kod Unicode. – leewz

+0

Otrzymuję ten błąd w 2.7.6 – user1167442

0

Podczas próby zapisania wyjścia interfejsu API JSON do pliku .cav przez pd.DataFrame.to_csv() na instalacji Win Python 2.7.14 napotkałem podobny błąd.

Określanie kodowanie jako utf-8 stały mój proces:

pd.DataFrame.to_csv(filename, encoding='utf-8') 
0

Dla każdego napotykają ten w MacOS, odpowiedź @ abarnert jest prawidłowa i udało mi się go naprawić poprzez umieszczenie tego w górnej części pliku źródłowego wykraczająca : -

# magic to make everything work in Unicode 
import sys 
reload(sys) 
sys.setdefaultencoding('utf-8') 

Aby to wyjaśnić, upewnij się, że wyjście terminalowe poprawnie akceptuje kod Unicode.

Powiązane problemy