Ne pouvez pas imprimer de caractère '\u2019' en Python à partir d'objet JSON
Comme un projet pour m'aider à apprendre le Python, je suis en train de faire un CMD visionneuse de Reddit en utilisant les données json (par exemple www.reddit.com/all/.json). Lorsque certains postes se montrer et je tente de les imprimer (c'est ce que je suppose est la cause de l'erreur), j'obtiens cette erreur:
Traceback (most recent call last):
Fichier "C:\Users\nsaba\Desktop\reddit_viewer.py", à la ligne 33, dans
print ( "%d. (%d) %s\n" % (i+1, obj['data']['score'], obj['data']['titre']))
Fichier "C:\Python33\lib\encodings\cp437.py", à la ligne 19, de coder
de retour de codecs.charmap_encode(d'entrée,de soi.les erreurs,encoding_map)[0]
UnicodeEncodeError: 'charmap' codec ne peut pas encoder les caractères '\u2019' à la position
32: tables de caractères à
C'est là que j'ai à traiter les données:
request = urllib.request.urlopen(url)
content = request.read().decode('utf-8')
jstuff = json.loads(content)
La ligne que j'utilise pour imprimer les données indiquées dans le message d'erreur ci-dessus:
print ( "%d. (%d) %s\n" % (i+1, obj['data']['score'], obj['data']['title']))
Quelqu'un peut-il suggérer où je pourrait mal se passer?
print('\u2019')
et de voir si vous recevez le même message d'erreur. Si oui, le problème, c'est que votre terminal (fenêtre"DOS") n'est pas programmé pour faire Unicode sortie correctement, et c'est ce que vous avez besoin pour réparer.Oui, vous avez raison. La raison pour laquelle les données supplémentaires est parce que j'ai appris à poser des questions compte tenu de l'information que j'ai, et pas sur ce que je pense qu'il pourrait être.
Mais vous devez poster les minimes exemple complet qui démontre votre problème. Qu'est ce qu'un SSCCE est tout au sujet. Si
print('\u2019')
est suffisante pour démontrer, tout exemple plus compliqué va juste amener les gens sur les poursuites de l'oie sauvage. Si vous êtes inquiet les gens pourraient se demander "Pourquoi voudriez-vous l'impression que le personnage?", vous pouvez ensuite ajouter le contexte qui l'explique... mais encore, le plomb avec le problème réel.Aussi, lorsque vous avez un problème avec Python 3, surtout quand il s'agit de quelque chose qui est un grand changement par rapport à Python 2 (comme Unicode impression), vous devez utiliser le python-3.x balise. Sinon, beaucoup de gens vont vous donner un Python 2.x-réponse spécifique (comme, en fait, deux personnes fait ici...).
OriginalL'auteur N-Saba | 2013-08-27
Vous devez vous connecter pour publier un commentaire.
Il est presque certain que votre problème n'a rien à voir avec le code que vous avez montré, et peut être reproduit en une seule ligne:
Si votre terminal du jeu de caractères ne peut pas gérer U+2019 (ou si Python est confus au sujet de ce jeu de caractères de votre terminal utilise), il n'y a aucun moyen de l'imprimer. Il n'a pas d'importance si elle vient de JSON ou n'importe où ailleurs.
Windows terminal (aka "DOS" ou "fenêtre cmd") est généralement configuré pour un jeu de caractères comme cp1252 qui connaît uniquement 256 de la 110000 caractères, et il n'y a rien de Python peut faire à ce sujet sans une évolution majeure du langage d'implémentation.*
Voir PrintFails sur le Python Wiki pour plus de détails, des solutions de contournement, et des liens vers plus d'informations. Il y a aussi quelques centaines de dup sur ce problème (bien que beaucoup d'entre eux sera spécifique à Python 2.x, sans le mentionner).
* Windows dispose d'un ensemble distinct ensemble d'Api pour l'impression UTF-16 pour le terminal, de sorte Python pourrait détecter que stdout est un Windows terminal server, et si oui encoder en UTF-16 et de l'utilisation de l'Api spécial au lieu de codage pour le terminal de jeu de caractères et l'utilisation de la norme. Mais cela soulève un tas de différents problèmes (par exemple, les différentes manières de l'impression à
stdout
sortir de synchronisation). Il y a eu des discussions au sujet de faire ces changements, mais même si tout le monde étaient d'accord et le patch ont été écrites demain, ils ne pourront pas vous aider jusqu'à ce que la mise à niveau vers quel que soit l'avenir de la version de Python, il est ajouté à...Eh bien, il est difficile de savoir ce qui est une dup, parce que c'est pas vraiment clair sur ce que vous devriez être à la recherche pour jusqu'à ce que vous savez déjà au moins la moitié de la réponse...
Je sais que c'est un vieux thread, mais vous devez marquer ce que la réponse si il a bien répondu à votre question (elle a fait la mienne)
OriginalL'auteur abarnert
@N-Saba, quelle est la chaîne qui provoque l'erreur d'être jeté?
Dans mon cas de test, ce qui semble être une version spécifique de bug en python 2.7.3.
Dans l'alimentation, j'ai été l'analyse, le champ "titre" a la valeur suivante:
- Je obtenir le droit prévu de devis unique char quand je l'appelle un de ces, en python 2.7.6.
Dans 2.7.3, j'obtiens l'erreur, à moins que j'ai coder la valeur que je l'ai tiré par KeyName.
fwiw, l' @abamert commande print('\u2019') imprime "9". Je pense que le but du code est imprimer(u'\u2019').
u
n'est pas nécessaire pour Python 3, car il est par défaut en Unicode.J'obtiens cette erreur dans 2.7.6
OriginalL'auteur Monte Hayward
Je suis tombé sur une semblable erreur lors de la tentative d'écriture d'une API JSON de sortie pour une .cav fichier via
pd.DataFrame.to_csv()
sur une Victoire de l'installation de Python 2.7.14.Spécifiant l'encodage
utf-8
fixe mon processus:OriginalL'auteur yeliabsalohcin
Pour quelqu'un rencontre ce dans macOS, @abarnert réponse est bonne et j'ai été en mesure de le réparer en mettant en haut de la délinquance fichier source:-
À éclaircir, c'est de s'assurer que la borne de sortie accepte Unicode correctement.
OriginalL'auteur Echelon
J'ai mis IDLE (Python Shell) et la Fenêtre CMD police par défaut pour Lucida Console (utf-8 prise en charge de la police) et ces types d'erreurs peuvent s'en alla; et vous ne voyez plus les boîtes [][][][][][][][]
🙂
OriginalL'auteur blakev