读取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.
相关产品推荐
相关产品推荐

