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

读取S3中Avro文件时遇AttributeError:_io.StringIO无mode属性

解决Avro文件读取时的AttributeError问题

问题分析

你遇到的AttributeError: '_io.StringIO' object has no attribute 'mode'错误,核心原因是DataFileReader要求传入的类文件对象必须具备mode属性且模式为二进制(包含b)。你的代码虽使用了io.BytesIO,但可能存在IO类导入错误或旧版本avro库兼容性问题。

解决方案

方案1:直接使用S3对象的Body作为输入

S3返回的obj["Body"]本身就是支持二进制读取的类文件对象,无需先读取成字节再包装,可简化代码:

obj = obj.get()
reader = DataFileReader(obj["Body"], DatumReader())

这种方式跳过手动包装字节流的步骤,直接提供符合要求的输入对象。

方案2:确保BytesIO的正确使用

检查io模块导入是否正确,明确使用二进制IO类,同时验证读取的字节类型:

import io
from avro.datafile import DataFileReader
from avro.io import DatumReader

obj = obj.get()
raw_bytes = obj["Body"].read()
# 确认raw_bytes为bytes类型,可通过print(type(raw_bytes))验证
avro_bytes = io.BytesIO(raw_bytes)
reader = DataFileReader(avro_bytes, DatumReader())

方案3:升级或更换Avro库

若为旧版本avro库兼容性问题,尝试升级到最新版:

pip install --upgrade avro-python3

或改用更灵活的fastavro库:

pip install fastavro

使用fastavro的示例代码:

import io
import fastavro

obj = obj.get()
raw_bytes = obj["Body"].read()
avro_bytes = io.BytesIO(raw_bytes)

with fastavro.reader(avro_bytes) as reader:
    for record in reader:
        # 处理单条记录
        print(record)

内容的提问来源于stack exchange,提问作者Nathanael P.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 20:01:07