【问题标题】:Byte file conversion via python 3通过python 3进行字节文件转换
【发布时间】:2016-01-15 20:12:37
【问题描述】:

我有什么简单的方法可以将二进制文件的内容读取为二进制字符串,将其转换为普通(utf-8)字符串,对其进行一些操作,将其转换回二进制字符串并写入它变成一个二进制文件?我尝试做一些简单的事情:

a_file = open('image1.png', 'rb')
text = b''
for a_line in a_file:
    text += a_line
a_file.close()
text2 = text.decode('utf-8')
text3 = text2.encode()
a_file = open('image2.png', 'wb')
a_file.write(text3)
a_file.close()

但我得到'Unicode 无法解码位置字节...'

我做错了什么?

【问题讨论】:

  • 为什么你认为 PNG 文件会包含文本?
  • 不确定您要完成什么,但this answer 另一个问题可能会有所帮助。

标签: python python-3.x utf-8 decode encode


【解决方案1】:

utf8 格式具有足够的结构,字节的随机排列不是有效的 UTF-8。最好的方法是简单地使用从文件中读取的字节(您可以使用text = a_file.read() 一步提取)。二进制字符串(bytes 类型)具有您想要的所有字符串方法,甚至是像 isupper()swapcase() 这样的面向文本的方法。然后是bytearray,它是bytes 类型的可变对应物。

如果出于某种原因真的想要将字节转换为 str 对象,请使用纯 8 位编码,例如 Latin1。你会得到一个 unicode 字符串,这是你真正想要的。 (UTF-8 只是 Unicode 的一种编码——完全不同。)

【讨论】:

  • 请注意,如果您选择了一个工作编码(例如latin-1),您不需要在Python 3 中自己处理编码/解码。只需将open('image1.png', 'rb') 更改为open('image1.png', 'r', encoding='latin-1') ,对于输出,open('image2.png', 'w', encoding='latin-1') 可以读写,而无需手动操作encode/decode;它会在读取时为您解码为str,并在写入时为您编码str
  • 好点;虽然以二进制模式打开文件会使代码更加透明......我不确定OP是否应该转换为str
猜你喜欢
  • 2018-06-20
  • 2019-03-28
  • 2014-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-26
  • 2017-09-13
  • 2014-01-27
相关资源
最近更新 更多