如何使用python3将字节数据转换为字符串而不更改数据

时间:2018-03-23 15:29:28

标签: python python-3.x

如何在不更改数据的情况下将字节转换为字符串? E.g
输入
file_data = b'\xb4\xeb7s\x14q[\xc4\xbb\x8e\xd4\xe0\x01\xec+\x8f\xf8c\xff\x00 \xeb\xff'

输出:
'\xb4\xeb7s\x14q[\xc4\xbb\x8e\xd4\xe0\x01\xec+\x8f\xf8c\xff\x00 \xeb\xff'

我想使用StringIO编写一个带有一些附加数据的图像数据,下面是我的代码片段,

img_buf = StringIO()
f = open("Sample_image.jpg", "rb")
file_data = f.read()
img_buf.write('\r\n' + file_data + '\r\n')

这适用于python 2.7,但我希望它能用于python 3.4 on read operation file_data = f.read()返回像这样的字节对象数据

b'\xb4\xeb7s\x14q[\xc4\xbb\x8e\xd4\xe0\x01\xec+\x8f\xf8c\xff\x00 \xeb\xff'  

使用img_buf写入数据时,它只接受字符串数据,因此无法使用其他字符写入file_data。 所以我想转换file_data,因为它在String对象中而不更改其数据。像这样的东西

'\xb4\xeb7s\x14q[\xc4\xbb\x8e\xd4\xe0\x01\xec+\x8f\xf8c\xff\x00 \xeb\xff'  

这样我就可以连接并写入图像数据。

我不想解码或编码数据。任何建议对我都有帮助。提前谢谢。

1 个答案:

答案 0 :(得分:0)

目前尚不清楚您想要什么样的输出。如果您对美学将字节转换为字符串表示而不进行编码感兴趣:

s = str(file_data)[1:]
print(s)
# '\xb4\xeb7s\x14q[\xc4\xbb\x8e\xd4\xe0\x01\xec+\x8f\xf8c\xff\x00 \xeb\xff'

这是原始字节字符串的informal string representation(无转换)。

<强>详情

official string representation看起来像这样:

s
# "'\\xb4\\xeb7s\\x14q[\\xc4\\xbb\\x8e\\xd4\\xe0\\x01\\xec+\\x8f\\xf8c\\xff\\x00 \\xeb\\xff'"

字符串表示处理字符串的外观。在Python中隐式解释双转义字符和双引号以执行正确的操作,以便print函数输出格式化字符串。

String intrepretation处理字符串的含义。每个字符块意味着根据应用的编码而有所不同。在这里,我们使用\\xb4编码解释这些字符块(例如\\xeb7sUTF-8)。此编码无法识别的块将替换为默认字符 :

file_data.decode("utf-8", "replace")
# '��7s\x14q[Ļ���\x01�+��c�\x00 ��'

为了可靠地处理字符串,需要从字节转换为字符串。

简而言之,字符串输出在其外观(表示)与其含义(解释)之间存在差异。澄清你喜欢哪些并相应地进行。

<强>附录

如果您的问题是“我如何连接字节字符串?”,这里有一种方法:

buffer = io.BytesIO()
with buffer as f:
    f.write(b"\r\n")
    f.write(file_data)
    f.write(b"\r\n")
    print(buffer.getvalue())
# b'\r\n\xb4\xeb7s\x14q[\xc4\xbb\x8e\xd4\xe0\x01\xec+\x8f\xf8c\xff\x00 \xeb\xff\r\n'

等效地:

buffer = b""
buffer += b"\r\n"
buffer += file_data
buffer += b"\r\n"
buffer
# b'\r\n\xb4\xeb7s\x14q[\xc4\xbb\x8e\xd4\xe0\x01\xec+\x8f\xf8c\xff\x00 \xeb\xff\r\n'