Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将文件从gcs复制到boto3中的s3_Python_Amazon S3_Google Cloud Storage_Boto3 - Fatal编程技术网

Python 将文件从gcs复制到boto3中的s3

Python 将文件从gcs复制到boto3中的s3,python,amazon-s3,google-cloud-storage,boto3,Python,Amazon S3,Google Cloud Storage,Boto3,我希望将文件从gcs复制到我的s3存储桶。在boto2中,简单如按钮 conn = connect_gs(user_id, password) gs_bucket = conn.get_bucket(gs_bucket_name) for obj in bucket: s3_key = key.Key(s3_bucket) s3_key.key = obj s3_key.set_contents_from_filename(obj) 然而,在boto3中,我无法找到等价的代

我希望将文件从gcs复制到我的s3存储桶。在boto2中,简单如按钮

conn = connect_gs(user_id, password)
gs_bucket = conn.get_bucket(gs_bucket_name) 
for obj in bucket:
   s3_key = key.Key(s3_bucket)
   s3_key.key = obj
   s3_key.set_contents_from_filename(obj)

然而,在boto3中,我无法找到等价的代码。有人吗?

如果你只是复印一份:

import boto3

s3 = boto3.resource('s3')
bucket = s3.Bucket('bucket-name')
for obj in gcs:
    s3_obj = bucket.Object(gcs.key)
    s3_obj.put(Body=gcs.data)
文件:

或者,如果您不想使用资源模型:

import boto3

s3_client = boto3.client('s3')
for obj in gcs:
    s3_client.put_object(Bucket='bucket-name', Key=gcs.key, Body=gcs.body)
文件:

注意:
gcs
位是伪代码,我不熟悉它们的API

编辑:

因此,
gcs
似乎支持旧版本的s3api,并支持旧版本的签名者。我们仍然支持那个老签名人,但你必须选择加入。请注意,某些区域不支持旧的签名版本(您可以看到一个列表,其中列出了哪些S3区域支持哪些版本),因此,如果您试图复制到其中一个,则需要使用不同的客户端

import boto3
from botocore.client import Config

# Create a client with the s3v2 signer
resource = boto3.resource('s3', config=Config(signature_version='s3'))
gcs_bucket = resource.Bucket('phjordon-test-bucket')
s3_bucket = resource.Bucket('phjordon-test-bucket-tokyo')
for obj in gcs_bucket.objects.all():
    s3_bucket.Object(obj.key).copy_from(
        CopySource=obj.bucket_name + "/" + obj.key)
文件:


当然,这只会在假定gcs仍然符合S3的情况下起作用。

遗憾的是,我认为目前不可能。。。我是从boto2那里获得gcs密钥的,我认为boto3不支持谷歌云存储……愚蠢的botoWell boto3是亚马逊的产品,不是为与谷歌服务交互而设计的。我相信在这种情况下,Google不支持最新的身份验证方案,因此您需要手动设置以使用旧的签名版本。我会更新我的答案,告诉你怎么做。