使用Python和boto将文件移动到存储桶中的特定键

问题描述 投票:1回答:2

使用boto将文件从一个点复制到另一个点时遇到问题。虽然我可以很容易地将它们复制到存储桶的顶级“级别”,但是我的存储桶由多个月密钥组成,当我尝试将文件复制到其中一个特定密钥时,我的代码会被挂起。所以例如这个工作,但把文件放入“主要桶”部分 - 这不是我想要做的(桶变为s3://mybucket/myFile.tar.gz而我真的需要该文件进入每月文件夹 - 类似于s3://mybucket/201507/myFile.tar.gz):

from ETLProcedural import ETLProceduralcls
a = ETLProceduralcls()
srcbucket = a._s3.get_bucket("mySOURCEbucket")
destbucket = a._s3.get_bucket("myDESTbucket")
source = srcbucket.get_key(“201507/myFILE.tar.gz") 
destination = destbucket.get_key(“DestSubFolder/201507/")
destbucket.copy_key(“myFILE.tar.gz", srcbucket.name,  source.key)

但是,如果我尝试将文件移动到目标存储桶中的特定月度文件中,我会挂断(没有错误 - 只是无休止的等待),所以这不起作用:

destbucket.copy_key(“DestSubFolder/201507/myFILE.tar.gz", srcbucket.name, source.key)

所以基本上想知道是否有人使用boto将文件移动到s3中的子文件夹(子键?)? (正如你所看到的 - 需要进入适当的月度文件夹)谢谢!

python-2.7 amazon-s3 boto
2个回答
7
投票

我认为问题是你在调用copy_key(string, string, key)而不是copy_key(string, string, string)。第三个参数是键(filename)的字符串,而不是实际的Key对象。您可以将键指定为字符串,也可以使用source.key.name

这对我有用:

>>> import boto
>>> conn=boto.connect_s3()
>>> destbucket=conn.get_bucket('bucket2')
>>> destbucket.copy_key('bar/file', 'bucket1', 'foo/file')
<Key: bucket2,bar/file>

它将s3://bucket1/foo/file复制到了s3://bucket2/bar/file


0
投票

约翰在这里提供boto

对于boto3,您可以执行以下操作

s3 = boto3.resource('s3')
dest = s3.Bucket('destinationbucket')
source= { 'Bucket' : 'sourcebucketname', 'Key': 'filename'}
dest.copy(source, 'destinationfilename')

它将从sourcebucketname/filename复制到destinationbucket/destinationfilename

© www.soinside.com 2019 - 2024. All rights reserved.