如何解决Pandas读取Mock S3存储桶CSV文件失败的问题?
解决Moto Mock S3下Pandas read_csv的AttributeError问题
问题核心原因
出现AttributeError: 'MockRawResponse' object has no attribute 'raw_headers'主要由以下几点导致:
- 桶名不匹配:你创建的Mock桶是
mock_bucket,但read_csv里引用的是amx-mock-bigdata-stemtime,路径指向的桶不存在。 - S3 Key格式错误:
put_object的Key开头带了斜杠/,S3的Key是对象的相对路径标识,不需要开头斜杠,会导致路径匹配失效。 - 版本兼容性:部分旧版本的Moto与Pandas依赖的
s3fs/boto3不兼容,Mock响应缺少raw_headers属性。
解决方案步骤
1. 修正桶名与Key路径
直接修正代码中的桶名和Key格式,确保路径完全匹配:
import os import boto3 import pandas as pd from moto import mock_s3 S3_BUCKET_NAME = 'mock_bucket' def s3_bucket(): mocks3 = mock_s3() mocks3.start() os.environ["AWS_DEFAULT_REGION"] = "us-east-1" s3 = boto3.resource('s3') s3.create_bucket(Bucket=S3_BUCKET_NAME) return s3, mocks3 # 返回mock对象,方便后续停止 s3, mocks3 = s3_bucket() bucket = s3.Bucket(S3_BUCKET_NAME) # 修正Key:去掉开头的斜杠 bucket.put_object(Key='2022/12/14/6/25/t_ext_gop/t.csv', Body='col1,col2\nval1,val2') # 修正桶名:与创建的Mock桶一致 a = pd.read_csv(f's3://{S3_BUCKET_NAME}/2022/12/14/6/25/t_ext_gop/t.csv') print(a) # 停止mock,避免影响其他代码逻辑 mocks3.stop()
2. 调整依赖版本兼容性
如果修正路径后仍报错,升级相关依赖到兼容版本:
- 升级Moto到最新稳定版:
pip install --upgrade moto - 同步升级
s3fs:pip install --upgrade s3fs - 升级
boto3:pip install --upgrade boto3
3. 备选方案:直接用boto3读取后转Pandas
若上述方法仍有问题,可以绕过Pandas的S3直接读取逻辑,先用boto3获取对象内容再解析:
obj = s3.Object(S3_BUCKET_NAME, '2022/12/14/6/25/t_ext_gop/t.csv').get() df = pd.read_csv(obj['Body']) print(df)
内容的提问来源于stack exchange,提问作者Luv
相关产品推荐
相关产品推荐

