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

如何解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 04:15:53