Skip to content Skip to sidebar Skip to footer

Forcing Escaping Of Printable Characters When Printing Bytes In Python 3

I have a bytes object, for instance test = b'\x83\xf8\x41\x41\x41' I would like to print this object to stdout, but if I do, Python converts the printable characters in the object

Solution 1:

No, the repr() output is not configurable; it is a debug tool.

You could use binascii.hexlify() to get a hex representation:

>>> test = b'\x83\xf8\x41\x41\x41'
>>> from binascii import hexlify
>>> test = b'\x83\xf8\x41\x41\x41'
>>> print(hexlify(test))
b'83f8414141'

or you could convert each individual 'byte' value to a hex representation:

>>> print("b'{}'".format(''.join('\\x{:02x}'.format(b) for b in test)))
b'\x83\xf8\x41\x41\x41'

This produces an alternative representation.


Solution 2:

You can create your own class for this:

class EscapeAll(bytes):
    def __str__(self):
        return 'b\'{}\''.format(''.join('\\x{:02x}'.format(b) for b in self))


# b'\x31\x32\x33'
print(EscapeAll(b'123'))

Solution 3:

Here's a way that's 30x ! faster (134 MiB/s on Intel i7-8700, Python2) than

''.join('\\x{:02x}'.format(b) for b in test)

It avoids iterating using slow, interpreted Python loops and iterates in optimized code. The optimized binascii also contributes to the speed

import binascii

hex=binascii.b2a_hex(test)
# add \x prefix
hex2=bytearray(4*len(b))
hex2[0::4]='\\'*len(b)
hex2[1::4]='x'*len(b)
hex2[2::4]=hex[0::2]
hex2[3::4]=hex[1::2]

Post a Comment for "Forcing Escaping Of Printable Characters When Printing Bytes In Python 3"