You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 15:34:43