使用DuckDB查询Pandas DataFrame中bytearray图片数据遇类型错误
问题描述
- 原始场景:
df_image是一个Pandas DataFrame,包含bytes列,存储bytearray格式的图片数据,原本用以下代码可正常显示图片:[display(Image(copy.copy(BytesIO(x)).read(),width=300,height=170)) for x in df_image['bytes']] - 改用DuckDB查询后,执行相同显示逻辑抛出错误:
TypeError: a bytes-like object is required, not 'str'
查询代码:c = duckdb.query( "select a.bytes \ from \ df_image a" ).df() # 执行显示时出错 [display(Image(copy.copy(BytesIO(x)).read(),width=300,height=170)) for x in c['bytes']] - 用户尝试用
codecs.escape_decode(bytes(c.loc[0:0,'bytes'][0], "utf-16"))[0].decode("utf-16")转码,但导致图片数据损坏。
解决方法
DuckDB读取bytearray类型时会自动转成字符串,核心是把字符串无损转回二进制类型,以下两种方案可行:
方案1:显示时手动转回字节
直接将查询得到的字符串用latin-1编码转回bytes(latin-1是单字节编码,能1:1还原原始字节序列):
[display(Image(BytesIO(bytes(x, 'latin-1')).read(), width=300, height=170)) for x in c['bytes']]
注:不需要额外copy.copy(BytesIO),直接使用即可。
方案2:查询时指定二进制类型(推荐)
在DuckDB查询语句中,把bytes列显式转为BLOB类型(对应二进制数据),这样返回给Pandas的就是原生bytes类型,无需后续转换:
c = duckdb.query( "select CAST(a.bytes AS BLOB) as bytes \ from \ df_image a" ).df() # 直接用原来的显示代码即可 [display(Image(copy.copy(BytesIO(x)).read(),width=300,height=170)) for x in c['bytes']]
内容的提问来源于stack exchange,提问作者tinker
相关产品推荐
相关产品推荐

