使用boto3+pandas读取S3中CSV文件遇空数据及文件未找到错误
解决boto3读取S3 CSV到Pandas时的空DataFrame/文件找不到错误
核心问题分析
- FileNotFoundError 原因:
pd.read_csv()接收的参数是文件路径、类文件对象或文件类迭代器,你直接传入解码后的字符串,会被当作文件路径解析,自然报错“找不到空路径的文件”。 - EmptyDataError 原因:
botocore.response.StreamingBody是一次性流对象,只能读取一次。如果你的代码中(或测试过程中)已经调用过result['Body'].read(),第二次读取会返回空字节,导致Pandas解析不到数据。
正确解决方案
方案1:直接传递StreamingBody给read_csv
Pandas支持直接读取类文件对象,无需手动解码或转BytesIO,代码更简洁:
import boto3 import pandas as pd client = boto3.client( 's3', aws_access_key_id="xxx", aws_secret_access_key="xxx", ) key = 'Dir/filename.csv' result = client.get_object(Bucket="buck-1", Key=key) # 直接传递StreamingBody给read_csv df = pd.read_csv(result['Body']) print(df.head())
方案2:用BytesIO包装(确保只读取一次Body)
如果需要对字节流做预处理,先把流内容一次性读取保存,再传入BytesIO:
import boto3 import pandas as pd import io client = boto3.client( 's3', aws_access_key_id="xxx", aws_secret_access_key="xxx", ) key = 'Dir/filename.csv' result = client.get_object(Bucket="buck-1", Key=key) # 一次性读取所有字节并保存 csv_bytes = result['Body'].read() # 用BytesIO包装后传给read_csv df = pd.read_csv(io.BytesIO(csv_bytes)) print(df.head())
额外排查点
- 确认S3上的
Dir/filename.csv确实有内容,不是空文件 - 检查S3的Key是否正确:S3路径大小写敏感,确保目录和文件名完全匹配
- 验证当前AWS账号对该S3对象有
s3:GetObject权限
内容的提问来源于stack exchange,提问作者kms
相关产品推荐
相关产品推荐

