使用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文件内存在数据。我有两个疑问:
- 是否遗漏了必要操作?
- 我的解码方式是否正确?
执行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>}
将数据赋值给变量后访问仍得到空结果:
问题排查与解决
针对疑问的解答
是否遗漏必要操作?
- 核心问题:
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已经返回了完整数据,不存在权限不足或文件不存在的问题。
- 核心问题:
解码方式是否正确?
- 从
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
相关产品推荐
相关产品推荐

