我需要打印出一串二进制转义序列,例如\x05\x03\x87
,完全按照它们出现的样子。当我尝试打印它们时,Python 返回一串奇怪的非 ASCII 字符。如何将它们打印为字符串文字?
问问题
9254 次
3 回答
15
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 ])
于 2012-11-06T23:34:55.033 回答
4
使用字符串转义编码:
>>> print '\x05\x03\x87'.encode('string-escape')
\x05\x03\x87
来自文档:
在 Python 源代码中生成一个适合作为字符串文字的字符串
这基本上会给你同样的东西repr()
,没有那些讨厌的引号。
请注意,就像 Malvolio 的回答一样,这假设您只想要不可打印字符的转义版本,如果这不是您想要的,请澄清。
于 2012-11-06T23:35:22.150 回答
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'
于 2012-11-07T09:08:58.273 回答