8

I need to print out a string of binary escape sequences, e.g. \x05\x03\x87, exactly as they appear. When I try to print them, Python returns a string of weird non-ASCII characters. How can I print them as a string literal?

Amit
  • 981
  • 2
  • 9
  • 16
  • Please show some code. You seem to confuse the actual contents of a string with its representation in Python code, and we can only tell you what's the problem is if you show us the code. – Sven Marnach Nov 06 '12 at 23:34

3 Answers3

15

repr

>>> a='\x05\x03\x87'
>>> print a
?
>>> print repr(a)
'\x05\x03\x87'

EDIT

Sven makes the point that the OP might want every character dumped in hex, even the printable ones, in which case, the best solution I can think of is:

>>> print ''.join(map(lambda c:'\\x%02x'%c, map(ord, a)))
\x05\x03\x87

ADDITIONAL EDIT

Four years later, it occurs to me that this might be both faster and more readable:

>>> print ''.join(map(lambda c:'\\x%02x'% ord(c), a))

or even

>>> print ''.join([ '\\x%02x'% ord(c) for c in a ])
Michael Lorton
  • 43,060
  • 26
  • 103
  • 144
  • `' '` -- do you think that *isn't* what the OP wants? – Michael Lorton Nov 06 '12 at 23:36
  • At least from the wording of the question, he would want to print `'\x20'` exactly as it appears. I guess the problem is some confusion regarding string escaping, and I don't think the current answers resolve this confusion in any way. This answer has the additional problem that the representation of a string is implementation-defined, so you can't rely on this behaviour. – Sven Marnach Nov 06 '12 at 23:40
3

Use the string-escape encoding:

>>> print '\x05\x03\x87'.encode('string-escape')
\x05\x03\x87

From docs:

Produce a string that is suitable as string literal in Python source code

This will essentially give you the same thing as repr(), without those pesky quotes.

Note that like Malvolio's answer, this assumes that you only want the escaped version for non-printable characters, if this is not what you want please clarify.

Andrew Clark
  • 202,379
  • 35
  • 273
  • 306
2

You can derive your own subclass of str that behaves & prints the way you desire, yet can be used almost anywhere a regular string could be and has all the same built-in methods.

As you can see, the example prints the hex values of all the characters it contains, whether they're printable normally or not -- something which could be done differently if you wanted, of course.

class HexStr(str):
    def __repr__(self):
        return "'" + ''.join('\\x{:02x}'.format(ord(ch)) for ch in self) + "'"
    __str__ = __repr__

a = HexStr('abc\x05\x03\x87')
print a
print str(a)
print repr(a)

Output:

'\x61\x62\x63\x05\x03\x87'
'\x61\x62\x63\x05\x03\x87'
'\x61\x62\x63\x05\x03\x87'
martineau
  • 119,623
  • 25
  • 170
  • 301