Supprimer / imprimer sans préfixe b 'pour les octets en Python 3

112

Il suffit de poster ceci pour que je puisse le rechercher plus tard, car cela semble toujours me surprendre:

$ python3.2
Python 3.2 (r32:88445, Oct 20 2012, 14:09:50) 
[GCC 4.5.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import curses
>>> print(curses.version)
b'2.2'
>>> print(str(curses.version))
b'2.2'
>>> print(curses.version.encode('utf-8'))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'bytes' object has no attribute 'encode'
>>> print(str(curses.version).encode('utf-8'))
b"b'2.2'"

Comme question: comment imprimer une byteschaîne binaire ( ) en Python 3, sans le b'préfixe?

sdaau
la source

Réponses:

111

Utilisez decode:

print(curses.version.decode())
# 2.2
sdaau
la source
1
@jamylak il est rappelé qu'il peut accepter le paramètre
Jemshit Iskenderov
1
Comment faire cela par défaut, je veux dire, est-ce mauvais à utiliser utf-8par défaut? Je ne veux pas utiliser le à .decode('utf-8')chaque fois que j'imprime quelque chose.
Shubham A.
Créer une impression personnalisée
SmartManoj
Assurez-vous de vérifier que ce curses.versionn'est pas None
cowlinator
24

Si les octets utilisent déjà un codage de caractères approprié; vous pouvez les imprimer directement:

sys.stdout.buffer.write(data)

ou

nwritten = os.write(sys.stdout.fileno(), data)  # NOTE: it may write less than len(data) bytes
jfs
la source
12

Si nous examinons la source de bytes.__repr__, il semble que le b''soit intégré à la méthode.

La solution de contournement la plus évidente consiste à découper manuellement b''le résultat repr():

>>> x = b'\x01\x02\x03\x04'

>>> print(repr(x))
b'\x01\x02\x03\x04'

>>> print(repr(x)[2:-1])
\x01\x02\x03\x04
Mateen Ulhaq
la source
6
Note latérale: je ne pense pas que les autres réponses répondent vraiment à la question.
Mateen Ulhaq
Je pense que je serais d'accord: votre solution, à savoir repr(x)[2:-1], produit un strobjet qui s'imprimera comme vous le souhaitez. En particulier, repr(b'\x01')[2:-1]retourne la chaîne \\x01, tandis que decode()retournera \x01ce qui ne fonctionne pas comme on le souhaiterait avec print(). Pour être encore plus explicite, print(repr(b'\x01')[2:-1])imprimera \x01tandis que print(b'\x01'.decode())n'imprimera rien.
Antoine
Alternativement, print(repr(b"\x01".decode()))imprimera '\x01'(une chaîne comprenant les guillemets simples), de sorte que print(repr(b"\x01".decode())[1:-1])imprime \x01(une chaîne sans les guillemets simples).
Antoine
11

Si les données sont dans un format compatible UTF-8, vous pouvez convertir les octets en une chaîne.

>>> import curses
>>> print(str(curses.version, "utf-8"))
2.2

Éventuellement, convertissez d'abord en hexadécimal, si les données ne sont pas déjà compatibles UTF-8. Par exemple, lorsque les données sont des octets bruts réels.

from binascii import hexlify
from codecs import encode  # alternative
>>> print(hexlify(b"\x13\x37"))
b'1337'
>>> print(str(hexlify(b"\x13\x37"), "utf-8"))
1337
>>>> print(str(encode(b"\x13\x37", "hex"), "utf-8"))
1337
Franc
la source