Python - 二进制转义序列的字符串

时间:2012-11-06 23:33:03

标签: python string

我需要打印出一串二进制转义序列,例如\x05\x03\x87,与它们一样。当我尝试打印它们时,Python返回一串奇怪的非ASCII字符。如何将它们打印为字符串文字?

3 个答案:

答案 0 :(得分:13)

repr

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

修改

Sven指出OP可能希望以十六进制转储的每个字符,甚至是可打印的字符,在这种情况下,我能想到的最佳解决方案是:

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

其他编辑

四年后,我发现这可能更快,更具可读性:

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

甚至

>>> print ''.join([ '\\x%02x'% ord(c) for c in a ])

答案 1 :(得分:4)

使用string-escape encoding

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

来自docs:

  

在Python源代码中生成一个适合作为字符串文字的字符串

这基本上会给你与repr()相同的东西,没有那些讨厌的引号。

请注意,就像Malvolio的回答一样,这假设您只想要非可打印字符的转义版本,如果这不是您想要的,请澄清。

答案 2 :(得分:2)

您可以派生自己的str子类,其行为与以您希望的方式打印,但几乎可以在常规字符串的任何位置使用,并且具有所有相同的内置方法。

正如您所看到的,该示例打印所有的十六进制值,包含它们所包含的字符,无论它们是否正常打印 - 当然,如果您愿意,可以采取不同的方式,当然

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)

输出:

'\x61\x62\x63\x05\x03\x87'
'\x61\x62\x63\x05\x03\x87'
'\x61\x62\x63\x05\x03\x87'