gpt4 book ai didi

python - 如何使用 boto 将文件从 Amazon S3 流式传输到 Rackspace Cloudfiles?

转载 作者:IT老高 更新时间:2023-10-28 22:09:51 33 4
gpt4 key购买 nike

我正在将文件从 S3 复制到 Cloudfiles,并且我想避免将文件写入磁盘。 Python-Cloudfiles 库有一个 object.stream() 调用,看起来是我需要的,但我在 boto 中找不到等效调用。我希望我能够做类似的事情:

shutil.copyfileobj(s3Object.stream(),rsObject.stream())

boto(或者我想任何其他 s3 库)可以做到这一点吗?

最佳答案

此线程中的其他答案与 boto 有关,但 S3.Object 在 boto3 中不再可迭代。因此,以下内容不起作用,它会产生 TypeError: 's3.Object' object is not iterable 错误消息:

s3 = boto3.session.Session(profile_name=my_profile).resource('s3')
s3_obj = s3.Object(bucket_name=my_bucket, key=my_key)

with io.FileIO('sample.txt', 'w') as file:
for i in s3_obj:
file.write(i)

在 boto3 中,对象的内容可在 S3.Object.get()['Body'] 获得,这是一个可迭代的版本 1.9.68但以前不是。因此,以下内容适用于最新版本的 boto3,但不适用于早期版本:

body = s3_obj.get()['Body']
with io.FileIO('sample.txt', 'w') as file:
for i in body:
file.write(i)

因此,较旧的 bo​​to3 版本的替代方法是使用 read 方法,但这会将整个 S3 对象加载到内存中,这在处理大文件时并不总是可行:

body = s3_obj.get()['Body']
with io.FileIO('sample.txt', 'w') as file:
for i in body.read():
file.write(i)

但是 read 方法允许传入 amt 参数,指定我们要从底层流中读取的字节数。可以重复调用此方法,直到读取整个流:

body = s3_obj.get()['Body']
with io.FileIO('sample.txt', 'w') as file:
while file.write(body.read(amt=512)):
pass

深入botocore.response.StreamingBody代码一发现底层流也是可用的,所以我们可以迭代如下:

body = s3_obj.get()['Body']
with io.FileIO('sample.txt', 'w') as file:
for b in body._raw_stream:
file.write(b)

在谷歌搜索时,我还看到了一些可以使用的链接,但我没有尝试过:

关于python - 如何使用 boto 将文件从 Amazon S3 流式传输到 Rackspace Cloudfiles?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7624900/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com