【问题标题】:How to convert bytes data to string without changing data using python3如何使用python3将字节数据转换为字符串而不更改数据
【发布时间】:2018-09-02 08:11:46
【问题描述】:

如何在不更改数据的情况下将字节转换为字符串?
例如
输入:
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和一些额外的数据写一个图像数据,下面是我的代码sn-p,

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。
在读取操作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'  

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

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

【问题讨论】:

  • 您是在问如何将字节数据转换为字符串?只是my_string = file_data.decode('utf-8')? (意识到解码实际上是将字节转换为字符串......你确定你不想解码它吗?)
  • my_string = file_data.decode('utf-8') 给出错误UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb4 in position 0: invalid start byte
  • 我不会尝试将其作为重复项关闭,因为我还不明白您想要什么,但是stackoverflow.com/questions/13837848/… 是否解决了您的问题?
  • 其实,我会后退一点。请阅读How to Ask。您的标题提到“图像的字节数据”。这可能是您正在加载的 64 位编码图像数据。使用适当的函数,您可以将此数据转换为图像。为什么你希望它是一个字符串?你能edit你的问题告诉我们你到底想用它做什么吗?
  • 您需要更好地解释“不更改数据”的含义。数据不变;就像您使用解码时的解释方式一样。我将把它留在这里作为推荐阅读,并祝你好运。 docs.python.org/3.3/howto/unicode.html

标签: python python-3.x


【解决方案1】:

不清楚你想要什么样的输出。如果您对美观将字节转换为不带编码的字符串表示感兴趣:

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 函数输出格式化的字符串。

字符串解释处理字符串的含义。 每个字符块的含义都不同,具体取决于应用的编码。在这里,我们使用UTF-8 编码来解释这些字符块(例如\\xb4\\xeb7s)。此编码无法识别的块将替换为默认字符,�:

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'

【讨论】:

  • 我尝试了你在回答中提到的两种方法。 file_data = str(file_data)[2:-1] 返回类似于 '\\xb4\\xeb7s\\x14q[\\xc4\\xbb\\x8e\\xd4\\xe0\\x01\\xec+\\x8f\\xf8c\\xff\\x00 \\xeb\\xff' 的字符串,其中包含转义的反斜杠,我不想要转义的反斜杠。我已添加有关问题的简要说明以获取更多信息。谢谢@pylang
  • s 已转义字符,因为它是一个字符串。据我所知,您无法改变这一点(并且可能不应该尝试)。似乎您只想将数据附加到字节字符串,对吗?如果是这样,是否有必要有一个字符串结果?修改一个字节串怎么样?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-04
  • 1970-01-01
相关资源
最近更新 更多