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

使用boto3读取S3 Bucket文件返回空结果的问题排查

问题:从S3读取CSV返回空内容的排查

我用以下Python代码尝试从S3存储桶读取CSV文件:

s3=boto3.client('s3')
_data=s3.get_object(Bucket='ml-titanic-dataset',Key='test_data/test.csv')
_data['Body'].read().decode('utf-8')

但返回结果为空,可实际这个CSV文件内存在数据。我有两个疑问:

  1. 是否遗漏了必要操作?
  2. 我的解码方式是否正确?

执行print(_data)得到如下输出:

{'ResponseMetadata': {'RequestId': 'YTTJTHCNKWKV72SA', 
'HostId': 'GGzZuluP68nAiPEAKIpc6W8n9wQLhq+yb4phZS5DugcjmLkMlmw4FXl+R5jXDAw56VX6AqaOYk8=', 
'HTTPStatusCode': 200, 
'HTTPHeaders': {'x-amz-id-2': 'GGzZuluP68nAiPEAKIpc6W8n9wQLhq+yb4phZS5DugcjmLkMlmw4FXl+R5jXDAw56VX6AqaOYk8=', 
'x-amz-request-id': 'YTTJTHCNKWKV72SA', 'date': 'Tue, 13 Feb 2024 07:03:02 GMT',
 'last-modified': 'Mon, 12 Feb 2024 16:31:53 GMT', 'etag': '"7533b82eae4b582610cbd68aa636b017"',
 'x-amz-server-side-encryption': 'AES256', 'accept-ranges': 'bytes', 'content-type': 'text/csv', 
'server': 'AmazonS3', 'content-length': '28629'}, 'RetryAttempts': 0},
 'AcceptRanges': 'bytes', 'LastModified': datetime.datetime(2024, 2, 12, 16, 31, 53, tzinfo=tzutc()),
 'ContentLength': 28629, 'ETag': '"7533b82eae4b582610cbd68aa636b017"',
 'ContentType': 'text/csv', 'ServerSideEncryption': 'AES256', 'Metadata': {},
 'Body': <botocore.response.StreamingBody object at 0x7fafcfb9caf0>}

将数据赋值给变量后访问仍得到空结果:
读取结果为空的截图


问题排查与解决

针对疑问的解答

  1. 是否遗漏必要操作?

    • 核心问题:StreamingBody是流式对象,第一次调用read()后,指针会移动到流的末尾,再次调用就会返回空内容。你如果是先执行了一次_data['Body'].read().decode('utf-8'),之后再赋值给变量调用,自然得到空结果。
    • 正确操作:把读取到的内容先保存到变量中,后续操作直接使用该变量:
      s3 = boto3.client('s3')
      _data = s3.get_object(Bucket='ml-titanic-dataset', Key='test_data/test.csv')
      csv_content = _data['Body'].read().decode('utf-8')
      print(csv_content)  # 可正常输出文件内容
      
    • 补充:从返回结果的ContentLength:28629可以确认,S3已经返回了完整数据,不存在权限不足或文件不存在的问题。
  2. 解码方式是否正确?

    • 从ContentType: text/csv来看,使用utf-8解码是合理的。如果CSV文件是其他编码(比如gbk、utf-8-sig),通常会出现乱码而非空内容。如果后续遇到乱码,可以尝试utf-8-sig(处理带BOM的UTF-8文件)或对应编码。

更简洁的替代方案

可以直接用pandas读取S3文件,避免流式操作的问题:

import pandas as pd
df = pd.read_csv('s3://ml-titanic-dataset/test_data/test.csv')
print(df.head())

(需确保已配置boto3权限,或提前安装s3fs库)


内容的提问来源于stack exchange,提问作者Lijin Durairaj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 02:35:29