Amazon S3 下载文件方法返回空文件

我正在尝试从 Amazon S3 存储桶下载文件。下载成功,但我每次都得到一个空文件。我尝试下载其他文件以查看是否是文件问题,但发生了同样的事情。不知道问题是什么,但这就是我正在做的事情:

import boto3

s3 = boto3.client('s3')
with open('AWS Account Roles.csv', 'wb') as f:
    s3.download_fileobj('BUCKET_NAME', 'OBJECT_NAME', f)

我知道这不会改变任何东西,但我也尝试过这样做:

import boto3

s3 = boto3.client('s3')
s3.download_file('BUCKET_NAME', 'OBJECT_NAME', 'AWS Account Roles.csv')

任何帮助表示赞赏,谢谢大家!

stack overflow Amazon S3 download file method returns empty file
原文答案

答案:

作者头像

我使用以下命令下载一个 csv 文件对象。然后您可以使用任何您喜欢的方式来操作数据对象或将其写入本地文件。

import io
import boto3

obj = boto3.client('s3').get_object(Bucket='BUCKET_NAME', Key='OBJECT_NAME')
data = io.StringIO(obj['Body'].read().decode('utf-8'))
作者头像

我复现了这个问题,确定为什么下载的文件可以为空。问题是 s3.download_fileobj('BUCKET_NAME', 'OBJECT_NAME', f) 会将内容写入文件,但可能会也可能不会将内容刷新到存储中。您的示例显示您打开文件进行只写访问,而不是内容的读取方式。

如果您尝试在关闭下载文件之前读取此文件,它将是空的(或部分写入大量下载)。我用代码验证了这种行为,该代码在下载文件关闭之前和之后读取它。

write_file = open("/tmp/temp.txt", "wb")
s3 = boto3.client('s3')
s3.download_fileobj(Bucket="BUCKET", Key="KEY", Fileobj=write_file)

read_file = open("/tmp/temp.txt", "r")
assert read_file.read() == ""

write_file.close()

read_file = open("/tmp/temp.txt", "r")
assert read_file.read() == "Test Content"