如何将Python字符串表示的字节串转换为实际字节串?

3 投票
2 回答
6192 浏览
提问于 2025-04-16 13:33

我想弄明白怎么把一个表示字节串的字符串转换成真正的字节串类型。我对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

如果这样做更简单或者更符合规范,我可以使用这个。

2 个回答

3
>>> 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()

0

因为你的输入是用Python的语法写的,所以这里的做法就是直接调用 eval

>>> r"b'\x12\x12'"
"b'\\x12\\x12'"
>>> eval(r"b'\x12\x12'")
'\x12\x12'

不过要小心,因为这可能会带来安全问题。 eval 会执行 任何 代码,所以你可能需要对输入进行清理。在你的情况下,这很简单——只需要检查你要 eval 的内容确实是你期望的格式的字符串。如果安全不是问题,那就不用太担心了。

关于你的编辑:不过, eval 仍然是这里最简单的方法(如果没有 b'',就加上它)。当然,你也可以手动将每个 \xXX 转换成它的实际值。


(*) 为什么会这样呢?这似乎是一个奇怪的数据表示格式选择。

撰写回答