如何将下载的文件从S3桶复制/移动到同一桶下的不同文件夹,而不下载加载最新的文件



我正在使用python 2.7。和Boto API 2。X连接到AWS S3桶。我有一个独特的情况,我想从S3桶下载文件,从一个特定的目录/文件夹,说myBucket/foo/。但问题是我想在S3文件夹中留下一个最新的文件,而不是下载它。一旦我在本地机器上下载了这些文件,我想将这些文件移到同一桶下的另一个文件夹,比如myBucket/foo/bar/。以前有人遇到过类似的情况吗?

下面是一些解释:

  1. 将下载的文件从S3桶移动到同一桶下的不同文件夹路径

我的S3桶:事件日志S3桶上下载文件的文件夹路径:

event-logs/apps/raw/source_data/

S3桶上的文件夹路径,下载的文件将被移动(存档):

event-logs/apps/raw/archive_data/ 

注意:"event-logs/apps/raw/"路径通常在上面的同一个桶

下。

如果S3上的source_data文件夹下有5个文件

s3://event-logs/apps/raw/source_data/data1.gz
event-logs/apps/raw/source_data/data2.gz
event-logs/apps/raw/source_data/data3.gz
event-logs/apps/raw/source_data/data4.gz
event-logs/apps/raw/source_data/data5.gz

我需要下载前4个文件(最旧的文件)到我的本地机器,并留下最新的文件,即data5.gz后面。下载完成后,将这些文件从S3 ../source_data文件夹移动到同一S3桶下的../Archive_data文件夹,并从原始source_data文件夹中删除。下面是我的代码,用于列出S3中的文件,然后下载文件,然后删除文件。

AwsLogShip = AwsLogShip(aws_access_key, aws_secret_access_key, use_ssl=True)
bucket = AwsLogShip.getFileNamesInBucket(aws_bucket)
def getFileNamesInBucket(self, aws_bucket):
    if not self._bucketExists(aws_bucket):
        self._printBucketNotFoundMessage(aws_bucket)
        return list()
    else:
        bucket = self._aws_connection.get_bucket(aws_bucket)
        return map(lambda aws_file_key: aws_file_key.name, bucket.list("apps/raw/source_data/"))
AwsLogShip.downloadAllFilesFromBucket(aws_bucket, local_download_directory)
def downloadFileFromBucket(self, aws_bucket, filename, local_download_directory):
    if not self._bucketExists(aws_bucket):
        self._printBucketNotFoundMessage(aws_bucket)
    else:
        bucket = self._aws_connection.get_bucket(aws_bucket)
        for s3_file in bucket.list("apps/raw/source_data"):
            if filename == s3_file.name:
                self._downloadFile(s3_file, local_download_directory)
                Break;
AwsLogShip.deleteAllFilesFromBucket(aws_bucket)
def deleteFilesInBucketWith(self, aws_bucket, filename):
    if not self._bucketExists(aws_bucket):
        self._printBucketNotFoundMessage(aws_bucket)
    else:
        bucket = self._aws_connection.get_bucket(aws_bucket)
        for s3_file in filter(lambda fkey: filename(fkey.name), bucket.list("apps/raw/source_data/")):
            self._deleteFile(bucket, s3_file)

我真正想要实现的是:

  1. 选择要下载的最旧文件列表,这意味着总是将最新修改的文件留在后面,而不对其执行任何操作(因为这个想法是文件可能尚未准备好下载或仍在写入)。
  2. 与下载的文件列表相同。需要移动到同一桶下的新位置,并从原始source_data文件夹中删除。

我就是这样解决这个问题的!

     bucket_list = bucket.list(prefix='Download/test_queue1/', delimiter='/')
     list1 = sorted(bucket_list, key= lambda item1: item1.last_modified)
     self.list2 = list1[:-1]
     for item in self.list2:
         self._bucketList(bucket, item)
    def _bucketList(self,bucket, item):
    print item.name, item.last_modified

最新更新