使用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中的子文件夹(子键?)? (如你所见 - 需要进入适当的月度文件夹) 谢谢!
答案 0 :(得分:5)
我认为问题在于您拨打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
。
答案 1 :(得分:0)
约翰在这里提供boto
。
对于boto3
,您可以执行以下操作
s3 = boto3.resource('s3')
dest = s3.Bucket('destinationbucket')
source= { 'Bucket' : 'sourcebucketname', 'Key': 'filename'}
dest.copy(source, 'destinationfilename')
它将从sourcebucketname/filename
复制到destinationbucket/destinationfilename