Suprimir / imprimir sem o prefixo b 'para bytes em Python 3

112

Só estou postando isso para que eu possa pesquisar mais tarde, pois sempre parece me confundir:

$ 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'"

Como questão: como imprimir uma bytesstring binary ( ) em Python 3, sem o b'prefixo?

sdaau
fonte

Respostas:

111

Use decode:

print(curses.version.decode())
# 2.2
sdaau
fonte
1
@jamylak é um lembrete de que ele pode aceitar o parâmetro
Jemshit Iskenderov
1
Como fazer isso por padrão, quer dizer, é ruim usar utf-8por padrão? Não quero usar .decode('utf-8')toda vez que imprimo algo.
Shubham A.
Criar impressão personalizada
SmartManoj
Certifique-se de verificar curses.versionse não é Nenhum
cowlinator
24

Se os bytes já usam uma codificação de caracteres apropriada; você pode imprimi-los diretamente:

sys.stdout.buffer.write(data)

ou

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

Se dermos uma olhada na fonte de bytes.__repr__, parece que o b''está embutido no método.

A solução alternativa mais óbvia é cortar manualmente o b''do resultante 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
fonte
6
Nota lateral: não acho que nenhuma das outras respostas realmente responda à pergunta.
Mateen Ulhaq
Acho que concordaria: sua solução, ou seja repr(x)[2:-1], produz um strobjeto que será impresso como desejar. Em particular, repr(b'\x01')[2:-1]retorna a string \\x01, enquanto decode()irá retornar, \x01que não funciona como desejado print(). Para ser ainda mais explícito, print(repr(b'\x01')[2:-1])imprimirá \x01enquanto print(b'\x01'.decode())não imprimirá nada.
Antoine de
Alternativamente, print(repr(b"\x01".decode()))irá imprimir '\x01'(uma string incluindo as aspas simples), de forma que print(repr(b"\x01".decode())[1:-1])imprime \x01(uma string sem as aspas simples).
Antoine
11

Se os dados estiverem em um formato compatível com UTF-8, você pode converter os bytes em uma string.

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

Opcionalmente, converta em hexadecimal primeiro, se os dados ainda não forem compatíveis com UTF-8. Por exemplo, quando os dados são bytes brutos reais.

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
Frank
fonte