178

How do I print a bytes string without the b' prefix in Python 3?

>>> print(b'hello')
b'hello'
1

9 Answers 9

180

Use decode:

>>> print(b'hello'.decode())
hello
1
31

If the bytes use an appropriate character encoding already; you could print them directly:

sys.stdout.buffer.write(data)

or

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

According to the source for bytes.__repr__, the b'' is baked into the method.

One workaround is to manually slice off the b'' from the resulting repr():

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

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

>>> print(repr(x)[2:-1])
\x01\x02\x03\x04
5
  • 9
    Side note: I don't think any of the other answers truly answer the question. Commented Jul 29, 2019 at 6:42
  • I think I would agree: your solution, namely repr(x)[2:-1], produces a str object that will print as wish. In particular, repr(b'\x01')[2:-1] returns the string \\x01, while decode() will return \x01 which does not work as one would wish with print(). To be even more explicit, print(repr(b'\x01')[2:-1]) will print \x01 while print(b'\x01'.decode()) will not print anything.
    – Antoine
    Commented Sep 18, 2019 at 13:54
  • Alternatively, print(repr(b"\x01".decode()))will print '\x01' (a string including the single quotes ), so that print(repr(b"\x01".decode())[1:-1]) prints \x01 (a string without the single quotes ).
    – Antoine
    Commented Sep 18, 2019 at 14:04
  • I was hoping to rid of endless x.encode x.decode nonsense forever in py3 but still need this repr(x)[2:-1] stuff when dealing with encrypted data from py2 in py3... Sad...
    – SYK
    Commented Dec 6, 2023 at 10:26
  • The note that this is because of bytes.__repr__ is great, but the recommendation of print(repr(x)[2:-1]) is pretty darn ugly! Not a fan of the proposed solution, although this answer is very educational.
    – Eric Dand
    Commented Mar 21 at 21:18
26

If the data is in an UTF-8 compatible format, you can convert the bytes to a string.

>>> print(str(b"hello", "utf-8"))
hello

Optionally, convert to hex first if the data is not UTF-8 compatible (e.g. data is raw bytes).

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

To show or print:

<byte_object>.decode("utf-8")

To encode or save:

<str_object>.encode('utf-8')
4

I am a little late but for Python 3.9.1 this worked for me and removed the -b prefix:

print(outputCode.decode())
1
1

It's so simple... (With that, you can encode the dictionary and list bytes, then you can stringify it using json.dump / json.dumps)

You just need use base64

import base64

data = b"Hello world!" # Bytes
data = base64.b64encode(data).decode() # Returns a base64 string, which can be decoded without error.
print(data)

There are bytes that cannot be decoded by default(pictures are an example), so base64 will encode those bytes into bytes that can be decoded to string, to retrieve the bytes just use

data = base64.b64decode(data.encode())
1

Use decode() instead of encode() for converting bytes to a string.

>>> import curses
>>> print(curses.version.decode())
2.2
0

i know this has been answered but

encoded = str(encoded).replace('b', '', 1)
1
  • Also need to replace quotes.I ended up using this.str(encoded)[2:-1] Commented Apr 11 at 18:22

Not the answer you're looking for? Browse other questions tagged or ask your own question.