将 Python 2 转换为 Python 3 时的编码问题(使用 lmdb)
Encoding issues when converting Pyhon 2 to Python 3 (using lmdb)
我正在尝试将 Python 2 中的一些代码转换为 Python 3。我不太熟悉 [=30= 的两个版本之间编码工作方式的变化], 所以不太确定如何措辞这个问题。
基本上 Python2 中的代码如下所示:
image_key = "image_3"
env = lmdb.open(some arguments here)
with env.begin(write=False) as txn:
img_tmp = txn.get(image_key)
img = Image.open(StringIO(img_tmp))
在 Python 2 中,"img_tmp" 将是一个具有不可读字符的字符串对象(打印它让我一团糟:�PNGIHDR �A�� gAMA ����acHRMz&���� � �u0�`...)。下一行会将图像打开为枕头图像。
在 Python 3 中,行 txn.get() 会给我一个错误 "TypeError: Won't implicitly convert Unicode to bytes; use .encode()" 所以我按照建议将行转换为:
img_tmp = txn.get(img_key.encode())
但是,img_tmp 现在是一个字节对象,读取内容如下:"b'\x89PNG\r\n\x1a\n\x00\ ..."
并且下一行将不再打开图像。关于如何更改代码以使其正常工作的任何建议?
你就快完成了:只需使用 BytesIO
而不是 StringIO
,因为你的二进制数据是 bytes
而不是 str
.
我正在尝试将 Python 2 中的一些代码转换为 Python 3。我不太熟悉 [=30= 的两个版本之间编码工作方式的变化], 所以不太确定如何措辞这个问题。
基本上 Python2 中的代码如下所示:
image_key = "image_3"
env = lmdb.open(some arguments here)
with env.begin(write=False) as txn:
img_tmp = txn.get(image_key)
img = Image.open(StringIO(img_tmp))
在 Python 2 中,"img_tmp" 将是一个具有不可读字符的字符串对象(打印它让我一团糟:�PNGIHDR �A�� gAMA ����acHRMz&���� � �u0�`...)。下一行会将图像打开为枕头图像。
在 Python 3 中,行 txn.get() 会给我一个错误 "TypeError: Won't implicitly convert Unicode to bytes; use .encode()" 所以我按照建议将行转换为:
img_tmp = txn.get(img_key.encode())
但是,img_tmp 现在是一个字节对象,读取内容如下:"b'\x89PNG\r\n\x1a\n\x00\ ..."
并且下一行将不再打开图像。关于如何更改代码以使其正常工作的任何建议?
你就快完成了:只需使用 BytesIO
而不是 StringIO
,因为你的二进制数据是 bytes
而不是 str
.