如何在不更改数据的情况下将字节转换为字符串?
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'
这样我就可以连接并写入图像数据。
我不想解码或编码数据。任何建议对我都有帮助。提前谢谢。
答案 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
编码解释这些字符块(例如\\xeb
,7
,s
,UTF-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'