Comment obtenir la valeur ASCII d'un caractère?
La solution
De ici :
function ord () obtiendrait la valeur int de l'omble. Et au cas où vous voudriez reconvertir après avoir joué avec le nombre, fonction chr () fait le tour.
>>> ord('a')
97
>>> chr(97)
'a'
>>> chr(ord('a') + 3)
'd'
>>>
Dans Python 2, il existe également la fonction unichr
, qui renvoie la Unicode caractère dont l'ordinal est l'argument unichr
:
>>> unichr(97)
u'a'
>>> unichr(1234)
u'\u04d2'
En Python 3, vous pouvez utiliser chr
au lieu de unichr
.
Autres conseils
Notez que ord ()
ne vous donne pas la valeur ASCII en soi; il vous donne la valeur numérique du caractère, quel que soit son codage. Par conséquent, le résultat de ord ('& # 228;')
peut être 228 si vous utilisez Latin-1, ou déclenchez un TypeError
si vous utilisez UTF-8. Il peut même renvoyer le code codé Unicode à la place si vous lui transmettez un unicode:
>>> ord(u'あ')
12354
Vous recherchez:
ord()
La réponse acceptée est correcte, mais il existe un moyen plus astucieux / efficace de le faire si vous devez convertir tout un tas de caractères ASCII en leurs codes ASCII à la fois. Au lieu de faire:
for ch in mystr:
code = ord(ch)
ou légèrement plus rapide:
for code in map(ord, mystr):
vous convertissez en types natifs Python qui itèrent directement les codes. Sur Python 3, c'est trivial:
for code in mystr.encode('ascii'):
et sur Python 2.6 / 2.7, il n’est que légèrement plus impliqué car il n’a pas d’objet octets
de style Py3 ( octets
est un alias pour str.
, qui itère par caractère), mais ils ont bytearray
:
# If mystr is definitely str, not unicode
for code in bytearray(mystr):
# If mystr could be either str or unicode
for code in bytearray(mystr, 'ascii'):
Le codage en tant que type qui itère de manière native par ordinal signifie que la conversion est beaucoup plus rapide; lors des tests locaux sur Py2.7 et Py3.5, itérer un str
pour obtenir ses codes ASCII à l'aide de map (ord, mystr)
prend environ deux fois plus de temps un len
10 str
que d'utiliser bytearray (mystr)
sur Py2 ou mystr.encode ('ascii')
sur Py3 et à mesure que str
s'allonge, le multiplicateur payé pour la carte (ord, mystr)
s'élève à ~ 6,5x-7x.
Le seul inconvénient est que la conversion s'effectue en une seule fois. Votre premier résultat risque donc de prendre un peu plus de temps. Un str
vraiment énorme aurait un octets
/ bytearray
, mais à moins que cela ne vous oblige à balayer des pages, cela n’aura probablement aucune importance.