我试图找出如何将字节字符串的字符串表示转换为实际的字节字符串类型。我不太熟悉Python(只是为了帮助朋友而攻击它),所以我不确定是否有一些简单的“转换”方法(就像我心爱的Java一样;))。基本上我有一个文本文件,其内容为字节串:
b'\x03\xacgB\x16\xf3\xe1\\v\x1e\xe1\xa5\xe2U\xf0g\x956#\xc8\xb3\x88\xb4E\x9e\x13\xf9x\xd7\xc8F\xf4'
我目前在此文件中阅读如下:
aFile = open('test.txt')
x = aFile.read()
print(x) # prints b'\x03\xacgB\x16\xf3\xe1\\v\x1e\xe1\xa5\xe2U\xf0g\x956#\xc8\xb3\x88\xb4E\x9e\x13\xf9x\xd7\xc8F\xf4'
print(type(x)) # prints <class 'str'>
如何使x为<class 'bytes'>
类型?谢谢你的帮助。
编辑:阅读下面的其中一条回复后,我想我可能过多地限制了这个问题。我为此道歉。输入字符串不必是python字节字符串格式(即使用b和引号),它可能只是普通的字节字符串:
\x03\xacgB\x16\xf3\xe1\\v\x1e\xe1\xa5\xe2U\xf0g\x956#\xc8\xb3\x88\xb4E\x9e\x13\xf9x\xd7\xc8F\xf4
如果这样做更容易或更好,我可以使用它。
答案 0 :(得分:2)
>>> r'\x03\xacgB\x16\xf3\xe1\\v\x1e\xe1\xa5\xe2U\xf0g\x956#\xc8\xb3\x88\xb4E\x9e\x13\xf9x\xd7\xc8F\xf4'.decode('string-escape')
'\x03\xacgB\x16\xf3\xe1\\v\x1e\xe1\xa5\xe2U\xf0g\x956#\xc8\xb3\x88\xb4E\x9e\x13\xf9x\xd7\xc8F\xf4'
这适用于没有b'...'
的字符串。否则,我们鼓励您使用ast.literal_eval()
。
答案 1 :(得分:1)
由于你的输入是Python的语法,出于某种原因(*),这里要做的只是调用eval
:
>>> r"b'\x12\x12'"
"b'\\x12\\x12'"
>>> eval(r"b'\x12\x12'")
'\x12\x12'
但是要小心,因为这可能是一个安全问题。 eval
将运行任何代码,因此您可能需要清理输入。在你的情况下它很简单 - 只需检查你eval
的东西确实是你期望的格式的字符串。如果安全性不是问题,请不要打扰。
豁免编辑:尽管如此,eval
仍然是最简单的方法(如果不存在b''
,则添加\xXX
)。当然,您也可以通过将每个{{1}}转换为其实际值来手动执行此操作。
(*)为什么,真的吗?对于数据表示格式来说,这似乎是一个奇怪的选择