65
votes

In Python 3, one can format a string like:

"{0}, {1}, {2}".format(1, 2, 3)

But how to format bytes?

b"{0}, {1}, {2}".format(1, 2, 3)

raises AttributeError: 'bytes' object has no attribute 'format'.

If there is no format method for bytes, how to do the formatting or "rewriting" of bytes?

6

6 Answers

41
votes
22
votes

Another way would be:

"{0}, {1}, {2}".format(1, 2, 3).encode()

Tested on IPython 1.1.0 & Python 3.2.3

12
votes

Interestingly .format() doesn't appear to be supported for byte-sequences; as you have demonstrated.

You could use .join() as suggested here: http://bugs.python.org/issue3982

b", ".join([b'1', b'2', b'3'])

There is a speed advantage associated with .join() over using .format() shown by the BDFL himself: http://bugs.python.org/msg180449

10
votes

I found the %b working best in Python 3.6.2, it should work both for b"" and "":

print(b"Some stuff %b. Some other stuff" % my_byte_or_unicode_string)
4
votes

For Python 3.6+ you can use this nice and clean syntax:

f'foo {bar}'.encode() # a byte string
-1
votes

I've found this to work.

a = "{0}, {1}, {2}".format(1, 2, 3)

b = bytes(a, encoding="ascii")

>>> b
b'1, 2, 3'