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

Python 2.7 如何将下载的文件从S3 bucket复制/移动到同一bucket下的不同文件夹,而不下载加载最新文件,python-2.7,amazon-web-services,amazon-s3,boto,Python 2.7,Amazon Web Services,Amazon S3,Boto,我正在使用python 2.7.x和Boto API 2.x连接到AWS S3 bucket。我有一个独特的情况,我想从S3 bucket下载文件,从一个特定的目录/文件夹(比如myBucket/foo/)下载。但问题是我想在S3文件夹中留下一个最新的文件,而不是下载它。一旦我将这些文件下载到本地文件盒中,我想将这些文件移到同一个bucket下的另一个文件夹中,比如myBucket/foo/bar/。以前有人做过类似的工作吗 以下是一些解释: 将下载的文件从S3存储桶移动到同一存储桶下的不同文件

我正在使用python 2.7.x和Boto API 2.x连接到AWS S3 bucket。我有一个独特的情况,我想从S3 bucket下载文件,从一个特定的目录/文件夹(比如myBucket/foo/)下载。但问题是我想在S3文件夹中留下一个最新的文件,而不是下载它。一旦我将这些文件下载到本地文件盒中,我想将这些文件移到同一个bucket下的另一个文件夹中,比如myBucket/foo/bar/。以前有人做过类似的工作吗

以下是一些解释:

将下载的文件从S3存储桶移动到同一存储桶下的不同文件夹路径。 我的S3存储桶:事件日志 S3 bucket上下载文件的文件夹路径:

event-logs/apps/raw/source_data/
S3 bucket上的文件夹路径,下载的文件将被移动到该路径:

event-logs/apps/raw/archive_data/ 
注意:事件日志/apps/raw/path在同一个bucket下是通用的

因此,如果我在S3的source_数据文件夹下有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_数据文件夹移动到同一S3存储桶下的../Archive_数据文件夹,并从原始source_数据文件夹中删除。下面是我列出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)
我在这里真正想要实现的是:

选择要下载的最旧文件列表,这意味着始终保留最新修改的文件,不要对其执行任何操作,因为这样做的目的是文件可能尚未准备好下载或仍在编写中。 与下载的文件相同的列表。。需要移动到同一bucket下的新位置,并从原始source_数据文件夹中删除这些内容。
这就是我解决这个问题的方法

     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

你的要求很难理解。您能否提供一个示例,例如显示之前和之后的内容?此问题的答案可能会有所帮助-@John Rotenstein-根据您的要求,我已更新了问题的更多细节。我能听听你的专家意见吗?是的,这一切都有可能,但这里有一个想法。。。为什么要跳过最新的文件?如果仍在写入,则它可能不会出现在对象列表中。它是由多个进程编写的吗?它被覆盖了吗?如果没有,它可能只会在完全创建之后出现。这将大大简化您的需求,减少到大约3行:循环浏览列表、下载、移动。。。一旦文件被下载,您打算如何处理它们?您是单独处理它们,还是仅仅存储一份副本?如果只是为了保存副本,那么我建议使用aws s3 sync命令将本地目录与bucket同步。这样,您甚至不需要将文件移动到另一个目录,因为没有进行任何处理。你能对你的用例提供一个更详细的解释吗,比如为什么你需要这样移动文件?