web-dev-qa-db-fra.com

Supprimez le u'prefix indiquant unicode 'dans les chaînes python

Existe-t-il un moyen de supprimer globalement l'indicateur de chaîne unicode en python? Je travaille exclusivement avec unicode dans une application et je fais beaucoup de choses interactives. Avoir le u'prefix 'apparaître dans toutes mes sorties de débogage est inutile et désagréable. Peut-on l'éteindre?

46
Ryan

Vous pouvez utiliser Python 3.0 .. Le type de chaîne par défaut est unicode, donc le préfixe u'' N'est plus requis ..

Bref, non. Vous ne pouvez pas désactiver cette fonction.

u provient de la méthode unicode.__repr__, Qui est utilisée pour afficher des éléments dans REPL:

>>> print repr(unicode('a'))
u'a'
>>> unicode('a')
u'a'

Si je ne me trompe pas, vous ne pouvez pas remplacer cela sans recompiler Python.

La façon la plus simple de contourner ce problème consiste simplement à imprimer la chaîne.

>>> print unicode('a')
a

Si vous utilisez la fonction intégrée unicode() pour construire toutes vos chaînes, vous pourriez faire quelque chose comme ..

>>> class unicode(unicode):
...     def __repr__(self):
...             return __builtins__.unicode.__repr__(self).lstrip("u")
... 
>>> unicode('a')
a

..mais ne fais pas ça, c'est horrible

40
dbr

J'ai eu un cas où j'avais besoin de supprimer le préfixe u parce que je configurais du javascript avec python dans le cadre d'un modèle html. Une simple sortie laissait le préfixe u pour les touches dict, par ex.

var turns = [{u'armies':2...];

qui casse javascript.

Afin d'obtenir la sortie javascript nécessaire, j'ai utilisé le module json python pour coder la chaîne pour moi:

turns = json.dumps(turns)

Cela fait l'affaire dans mon cas particulier et comme les touches sont toutes en ascii, l'encodage ne pose aucun problème. Vous pourriez probablement utiliser cette astuce pour votre sortie de débogage.

28
Paul Whipp
from __future__ import unicode_literals

est disponible depuis Python 2.6 (sorti le 1er octobre 2008). Il est par défaut dans Python 3.

Il permet d'omettre le préfixe u'' Dans le code source bien qu'il ne change pas repr(unicode_string) ce serait trompeur.

Vous pouvez remplacer sys.displayhook() dans un Python REPL, pour afficher les objets comme vous le souhaitez. Vous pouvez également remplacer __repr__ Pour vos propres objets personnalisés.

8
jfs

utiliser str( text ) est une idée quelque peu mauvaise en fait chaque fois que vous ne pouvez pas être sûr à 100% du codage par défaut de votre python et du contenu exact de la chaîne --- ce dernier serait typique pour un texte récupéré sur Internet . De plus, selon ce que vous voulez faire, l'utilisation de print text.encode( 'utf-8' ) ou print repr( text.encode( 'utf-8' ) ) peut donner des résultats décevants, car vous pourriez obtenir un rendu plein de points de code illisibles comme \x3a.

je pense que l'idéal est vraiment de se prévaloir d'une ligne de commande compatible Unicode (difficile sous Windows, facile sous Linux) et de passer de python 2.x à python 3.x. la facilité et la clarté de la gestion du texte par rapport aux octets offertes par la nouvelle série python 3 est vraiment l'un des gros gains auxquels vous pouvez vous attendre. cela signifie que vous devrez passer un peu de temps à apprendre la distinction entre "octets" et "texte" et à saisir le concept des encodages de caractères, mais ce temps est beaucoup mieux passé dans un environnement python 3 que celui de python. une nouvelle approche de ces problèmes vexants est beaucoup plus claire et beaucoup moins sujette aux erreurs que ce que python 2 avait à offrir. j'irais jusqu'à appeler python 2 l'approche rétrospective de la problématique unicode, même si je la considérais comme supérieure --- quand je la comparais à la façon dont ce problème est traité dans php .

edit je viens de m'arrêter en ne discussion connexe ici sur SO et j'ai trouvé ce commentaire sur la façon dont ces php jours semble résoudre les problèmes de codage/unicode:

C'est comme une souris essayant de manger un éléphant. En encadrant Unicode comme une extension de ASCII (nous avons des chaînes normales et nous avons mb_strings), les choses se passent mal et se bloquent sur les cas spéciaux requis pour traiter les personnages avec des gribouillis drôles qui ont besoin de plus d'un octet. Si vous traitez Unicode comme fournissant un espace abstrait pour tout caractère dont vous avez besoin, ASCII est adapté en cela sans qu'il soit nécessaire de le traiter comme un cas spécial.

je cite cela ici parce que, selon mon expérience, 90% de tous les sujets SO python + unicode semblent provenir de personnes qui se débrouillaient bien avec ascii ou peut-être latin-1, se sont fait mordre par le caractère occasionnel qui n'était pas pris en charge dans leurs paramètres habituels, puis je veux simplement m'en débarrasser. ce que vous faites lorsque vous passez à python 3 est exactement ce que le commentateur ci-dessus suggère de faire: au lieu de voir unicode comme une extension vexante d'ascii, vous commencez à afficher ascii (et presque tout autre encodage que vous rencontrerez jamais) comme sous-ensemble (s) d'unicode.

pour être vrai, l'unicode v6 n'est certainement pas le dernier mot dans les encodages, mais il est aussi proche d'être universel que vous pouvez l'obtenir en 2011. habituez-vous.

7
flow

Juste au cas où vous obtenez quelque chose comme ça u['hello'], Alors vous devez imprimer un tableau. imprimer str(arr[0]) et vous êtes prêt à partir.

4
user3526

Ce qui semble fonctionner pour moi:

import ast
import json
j = json.loads('{"one" : "two"}')
j
dd = {u'one': u'two'}
dd
# to get double quotes
json.dumps(j,  encoding='ascii')
json.dumps(dd, encoding='ascii')
# to get single quotes
str(ast.literal_eval(json.dumps(j,  encoding='ascii')))
str(ast.literal_eval(json.dumps(dd, encoding='ascii')))

Production:

>>> {u'one': u'two'}
>>> {u'one': u'two'}
>>> '{"one": "two"}'
>>> '{"one": "two"}'
>>> "{'one': 'two'}"
>>> "{'one': 'two'}"

Ci-dessus fonctionne pour les dictionnaires et les objets JSON, comme cela va de soi.

Pour juste une chaîne, l'encapsulation dans str () semble fonctionner pour moi.

s=u'test string'
s
str(s)

Production:

>>> u'test string'
>>> 'test string'

Version Python: 2.7.12

4
tautology

Je sais que ce n'est pas une option globale, mais vous pouvez également supprimer l'Unicode u en plaçant la chaîne dans une fonction str ().

Donc, une liste dérivée Unicode qui ressemblerait à:

>>> myList=[unicode('a'),unicode('b'),unicode('c')]
>>> myList
[u'a', u'b', u'c']

deviendrait ceci:

>>> myList=[str(unicode('a')),str(unicode('b')),str(unicode('c'))]
>>> myList
['a', 'b', 'c']

C'est un peu lourd, mais peut être utile à quelqu'un

4
Electrice

Pas sûr avec unicode, mais généralement vous pouvez appeler str.encode() pour le convertir sous une forme plus appropriée. Par exemple, la sortie de sous-processus capturée dans Python 3.0+ la capture comme un flux d'octets (préfixe 'b'), et les correctifs encode () sous forme de chaîne régulière.

3
AK.

Dans le cas où vous ne souhaitez pas mettre à jour vers Python 3, vous pouvez utiliser des sous-chaînes. Par exemple, supposons que la sortie d'origine était (u'mystring ',). Supposons pour dans l'intérêt de l'exemple que la ligne de variable contient la chaîne "mystring" sans le préfixe unicode. Ensuite, vous voudriez faire quelque chose comme ceci:

temp = str(row); #str is not necessary, but probably good practice
temp = temp[:-3];
print = temp[3:];
1
Agent0

Essayez ce qui suit

print str (result.url)

Il se peut que votre encodage par défaut ait été modifié.

Vous pouvez vérifier votre encodage par défaut avec les éléments suivants: -

> import sys
> print sys.getdefaultencoding()
> ascii

La valeur par défaut doit être ascii, ce qui signifie que u'string 'doit être imprimé en tant que' chaîne 'mais la vôtre peut avoir été modifiée.

1
Martin

Vous devez utiliser print str(your_Variable)

1
Nasser Hadjloo