参见底部更新-问题略有变化
我试图使用boto3的.download_fileobj
方法从s3下载一个文件到一个类文件对象,但是当我试图检查下载的字节流时,它是空的。我不知道我做错了什么,然而:
client = boto3.client('s3')
data = io.BytesIO()
client.download_fileobj(Bucket='mybucket', Key='myfile.wav', Fileobj=data)
print(data.read())
产生一个空字节串:
b''
更新:
有点解决。所以在download_fileobj
线后面加上data.seek(0)
就解决了这个问题。鉴于此,我现在正在寻找一个答案来解释这个代码片段做了什么以及为什么它解决了这个问题。
谢谢你,我也遇到了同样的问题。: o)
这样做的原因是文件缓冲区对象使用一个内部指针,该指针指向要读取或写入的当前位置。
当您向read()
方法传递一些字节来读取或持续写入文件的下一部分时,这一点很重要。
当client.download_fileobj()
写入字节流时,或者任何操作写入字节流时,指针指向上次写入操作的末尾。
所以你需要告诉文件缓冲区对象你想从刚写的内容开始读。