2015-10-07 37 views
1

我在Amazon S3上的存储桶events_logs下有一个像/Download/test_queue1/这样的文件夹结构。我想只删除对象并保留文件夹结构。有可能这样做吗?如何从Amazon S3中删除对象,而不是包含对象的子文件夹,使用python的boto库

所以,我想删除aa.txtbb.txt & cc.txt而不是/Download/test_queue1/子文件夹结构。我怎么做?

/Download/test_queue1/aa.txt 
/Download/test_queue1/bb.txt 
/Download/test_queue1/cc.txt 

这是我的代码,它正在清除桶下的所有东西。

def _deleteFileInBucket(self,s3_file1,aws_bucket_to_download,aws_bucket_path_to_download): 
     bucket_path = os.path.join(aws_bucket_path_to_download, s3_file1.strip()) 
    if not re.match(r'.*\.tar\.gz', bucket_path): 
     print "No batch available to delete from {}".format(aws_bucket_path_to_download) 
    else: 
     bucket = self._aws_connection.get_bucket(aws_bucket_to_download) 
     bucket_list = bucket.list(prefix='Download/test_queue1') 
     bucket.delete_keys([key.name for key in bucket_list])` 

我能够做到这一点使用AWS CLI:

os.system('aws s3 rm s3://{}{}'.format(aws_bucket_path_to_download[1:], s3_file1.strip())) 

但我怎么能实现使用Boto程式库相同的结果?

+1

为什么你想删除对象,但不是目录?如果你能解释它的使用方式,可能有更好的方法来实现你的目标。 –

+0

我的目标是从增量的基础上从S3的'Download/test_queue1 /'位置下载对象。我下载对象并从相同的位置删除它们。所以,最好我想保留S3上的文件夹结构。 – Guddi

+0

但是有没有一个真正的需要保留文件夹结构?另外,FYI也可以使用[AWS命令行界面(CLI)](http://aws.amazon.com/cli/),它具有'aws s3 sync'命令,它将同步文件往返于Amazon S3。这意味着您可以确保您拥有S3中的任何“本地”副本。所以,保持同步而不是下载和删除。 (这一切都取决于你的实际目标,因此这个问题。) –

回答

0

S3有水桶和物体;它没有文件夹。话虽如此,你可以创建一个名为mybucket/myfolder /的零大小的对象,它会给出一个名为'myfolder'的文件夹的外观,但它不是一个真正的文件夹。这就是AWS控制台在您要求创建文件夹时所执行的操作。

因此,您应该简单地从/ Download/test_queue1 /中逐个删除对象。完成之后,可能会或可能不会有名为/ Download/test_queue1 /的剩余对象。如果您之前创建了一个名为/ Download/test_queue1 /的零大小的对象,它将会出现,否则它将不存在。

如果你确实需要一个'文件夹',那么在删除对象之后,你应该测试/ Download/test_queue1 /的存在,如果它不存在,那么简单地将它创建为一个零大小的对象,然后你可以做到这一点在boto3这样的事情:

import boto3 
s3 = boto3.resource('s3') 
object = s3.Object('events_logs', 'Download/test_queue1/') 
object.put()