Ce n'python fonction print ()?
Je regardais ce question et a commencé à se demander quel est le print
réellement faire.
Je n'ai jamais trouvé comment l'utiliser string.decode()
et string.encode()
pour obtenir une chaîne unicode "out" dans le python shell interactif dans le même format que le print. Peu importe ce que je fais, je reçois soit
- UnicodeEncodeError ou
- échappé à la chaîne "\x##" notation...
C'est python 2.x, mais je suis déjà en essayant de réparer mes moyens et fait appel print()
🙂
Exemple:
>>> import sys
>>> a = '\xAA\xBB\xCC'
>>> print(a)
ª»Ì
>>> a.encode(sys.stdout.encoding)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
UnicodeDecodeError: 'ascii' codec can't decode byte 0xaa in position 0: ordinal not in range(128)
>>> a.decode(sys.stdout.encoding)
u'\xaa\xbb\xcc'
MODIFIER:
Pourquoi suis-je demander? Je suis malade et fatigué de encode()
erreurs et a constaté que, depuis print
peuvent le faire (au moins dans le shell interactif). Je sais que le DOIT ÊTRE UN MOYEN, par magie, l'encodage CORRECTEMENT, par le creusement de l'info que l'encodage à utiliser à partir de quelque part...
INFORMATIONS SUPPLÉMENTAIRES:
Je suis en cours d'exécution Python 2.4.3 (N ° 1, Sep 3 2009, 15:37:12) [GCC 4.1.2 20080704 (Red Hat 4.1.2-46)] on linux2
>>> sys.stdin.encoding
'ISO-8859-1'
>>> sys.stdout.encoding
'ISO-8859-1'
Cependant, les résultats sont les mêmes avec Python 2.6.2 (r262:71600, du 8 septembre 2009, 13:06:43) sur la même machine sous linux.
C'est la question liée à Python 2 ou 3?
Depuis, il parle de la "fonction d'impression", c'est probablement Python 3.
Oh, en fait,
print(a)
ne fonctionnent tous comme ce que vous montrons ici pour moi... Pourriez-vous donner la version exacte de Python que vous utilisez, ainsi que les valeurs de sys.stdin.encoding
et sys.stdout.encoding
dans votre environnement? Il se pourrait bien que certains de la "magie" vous essayez de répliquer se produit uniquement à cause de quelque chose de propre à votre installation... Désolé de ne pas apporter d'abord une chose, qui aurait été la chose la plus évidente à faire.Ok, je commence à penser que c'est effectivement mon terminal, pas de python que la "magie", par exemple convertit les données binaires pour les caractères non ascii,...
OriginalL'auteur Kimvais | 2009-12-30
Vous devez vous connecter pour publier un commentaire.
EDIT: (modifications Majeures entre cette édition et la précédente... Note: je suis à l'aide de Python 2.6.4 sur une Ubuntu boîte.)
Tout d'abord, dans ma première tentative de réponse, j'ai fourni des informations générales sur
print
etstr
qui je vais laisser ci-dessous au profit de la personne ayant des problèmes les plus simples avecprint
et de devoir changer à cette question. Comme pour une nouvelle tentative de régler le problème rencontré par l'OP... en gros, je suis enclin à dire qu'il n'y a pas de solution miracle ici, et siprint
réussit à donner du sens à une étrange chaîne littérale, alors ce n'est pas reproductible comportement. Je suis conduit à cette conclusion par le texte suivant drôle interaction avec Python dans ma fenêtre de terminal:Avez-vous essayé d'entrée ª»Ì directement depuis le terminal? À un terminal Linux, l'utilisation de l'utf-8 comme encodage, c'est en fait de lire dans les six octets, qui peut ensuite être faites pour ressembler à trois caractères unicode à l'aide de la
decode
méthode:Donc, le
'\xaa\xbb\xcc'
littérale n'a de sens que si vous le décoder comme un latin-1 littéral (bien, en fait, vous pouvez utiliser un autre encodage qui est d'accord avec latin-1 sur les personnages). Comme pourprint
'travail' dans votre cas, il n'est certainement pas pour moi, comme mentionné ci-dessus.Ceci est expliqué par le fait que lorsque vous utilisez un littéral de chaîne non préfixés par un
u
-- c'est à dire"asdf"
plutôt queu"asdf"
-- la chaîne résultante va utiliser certains non-unicode. Non; comme une question de fait, la chaîne de l'objet lui-même va être l'encodage n'est pas au courant, et vous allez avoir à la traiter comme si elle était codé avec le codage x, pour obtenir la valeur correcte de x. Cette idée de base me mène à la suivante:Noter l'absence d'erreurs de décodage et de la bonne sortie (qui je m'attends à être bon séjour à tout autre boîte). Apparemment, votre chaîne de caractères littérale peut être fait sens par Python, mais pas sans un peu d'aide.
Cela vous aide? (Au moins dans la compréhension de comment les choses fonctionnent, si pas en faisant la manipulation des codages plus simple...)
Maintenant, pour certains, drôle bits avec une certaine valeur explicative (je l'espère)! Cela fonctionne bien pour moi:
Sauter le décodage ou le coder une partie des résultats dans un format unicode d'exception liés. Théoriquement parlant, cela a du sens, comme le premier décodage est nécessaire pour déterminer quels caractères il existe dans la chaîne (la seule chose évidente à première vue, est ce que octets il y a -- le Python 3 idée d'avoir (unicode) de chaînes de caractères et des octets, pour, ainsi, les octets, tout d'un coup semble superbement raisonnable), alors que l'encodage est nécessaire pour que la sortie respecte l'encodage du flux de sortie. Maintenant, ce
aussi fonctionne comme prévu, mais les personnages sont réellement en provenance du clavier, et sont de ce fait encodé avec le stdin d'encodage... Aussi,
retourne le bon 177 (mon entrée encodage est utf-8), mais '\xc4\x85'.encode('latin2') n'a aucun sens de Python, comme il n'a pas la moindre idée de la façon de donner un sens '\xc4\x85' et les chiffres d'essayer le 'ascii' code est le meilleur qu'il peut faire.
L'original de la réponse:
Le tbi pertinent de Python docs (pour la version 2.6.4) dit que
print(obj)
est destinée à imprimer la chaîne de caractères donnée parstr(obj)
. Je suppose que vous pourriez ensuite l'envelopper dans un appel àunicode
(comme dansunicode(str(obj))
) pour obtenir une chaîne unicode -- ou vous pouvez simplement utiliser Python 3 et échange de cette nuisance pour un couple de types différents. 😉D'ailleurs, cela montre que vous pouvez manipuler le résultat de
print
ing un objet, tout comme vous pouvez manipuler le résultat de l'appelstr
sur un objet, c'est de jouer avec le__str__
méthode. Exemple:Que pour la mise en œuvre effective de
print
, j'espère que cela ne sera pas utile à tous, mais si vous vraiment voulez savoir ce qui se passe... C'est dans le fichierPython/bltinmodule.c
dans les sources Python (je suis à la recherche à la version 2.6.4). Recherche pour un début de ligne avecbuiltin_print
. C'est en fait tout à fait simple, pas de magie là. 🙂J'espère que cela répond à votre question... Mais si vous avez un plus mystérieux problème qui me manque, totalement, de faire un commentaire, je vais faire une seconde tentative. Aussi, je suis en supposant que nous avons affaire avec Python 2.x; sinon, je suppose que je n'aurais pas une observation utile.
Je suppose que c'est parce qu'à l'époque,
print
était encore syntaxe, wherasbuiltin_print
est nécessaire pour qu'il fonctionne comme une fonction. Aussi, lors du décodage de chaînes à venir à partir de stdin, vous aurez envie d'utilisersys.stdin.encoding
plutôt quesys.stdout.encoding
- bien sur, aujourd'hui, typiques de la zone, selon toute probabilité, ils sont les mêmes.Euh, je suppose que je suis le seul espoir de clarifier ce qui se passe sous le capot avec le dernier amendement à la réponse que ce qui peut être fait pour éviter des problèmes d'encodage, je suppose que ce n'est pas très optimiste. De toute façon, je me demande si il n'clarifier quoi que ce soit... Et puis il y a mon nouveau commentaire est joint à la question elle-même. Je suis définitivement en début de partager les "universitaires". (Je suis en ajoutant ce intéressant des balises, BTW. ;-))
OriginalL'auteur Michał Marczyk
print()
utilisesys.stdout.encoding
de déterminer en quoi la sortie de la console peuvent comprendre, puis utilise cet encodage dans l'appel àstr.encode()
.[EDIT] Si vous regardez la source, il obtient
sys.stdout
puis appelle:Je suppose que la magie est en
Py_PRINT_RAW
mais la source dit seulement:Donc pas de magie ici. Une boucle sur les arguments avec
sys.stdout.write(str(item))
devrait faire l'affaire.Alors que c'est probablement correct, il ne semble pas répondre à ma question. Apparemment, print() appelle éventuellement sys.la sortie standard stdout.write() qui fait de la magie, car la str.coder(sys.la sortie standard stdout.encodage) échoue...
J'ai regardé la source. Pas de magie.
OriginalL'auteur Aaron Digulla
Tous
print
est en train de faire ici est écrit raw octets àsys.stdout
. La chaînea
est une chaîne d'octets, et non pas des caractères Unicode.Hélas non,
print
est de ne rien faire du tout magique ici. Vous donnez en quelques octets, il vide les octets de sortie standard (stdout).À utiliser
.encode()
et.decode()
correctement, vous devez comprendre la différence entre les octets et les personnages, et je crains que vous n'avez pas à trouver le bon encodage à utiliser.OriginalL'auteur Jason Orendorff
Voir La Définition De Code Source Python Encodages
OriginalL'auteur jfs