当前位置: 首页 > 知识库问答 >
问题:

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

宇文育
2023-03-14

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

以下是一些解释:

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

My S3 bucket:事件记录S3 bucket上下载文件的文件夹路径:

event-logs/apps/raw/source_data/

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

event-logs/apps/raw/archive_data/ 

注意:“事件日志/apps/raw/”路径在同一个bucket下是常见的

所以如果我有5个文件在S3source_data文件夹下:

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中移出/源数据文件夹到/将_数据文件夹归档到同一个S3存储桶下,并从原始源_数据文件夹中删除。下面是我列出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文件夹中删除这些文件。

共有1个答案

陶锋
2023-03-14

这就是我解决这个问题的方法!

     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
 类似资料:
  • 我只想从s3 bucket inside文件夹下载最新文件。实际上,文件夹中有多个文件夹和文件。但我只需要下载最新日期的文件,并通过从多个文件夹中选择将其上载到一个文件夹中。我指的是stackoverflow源代码中的代码。 下面是s3桶的结构: 所以基本上,我想从文件夹(文件夹_1)内的s3 bucket下载最新文件,而不是从文件夹(文件夹_12、文件夹_13、文件夹_14)内下载最新文件。 我

  • 问题内容: 目标 将文件从s3存储桶下载到用户计算机。 语境 我正在为React应用开发Python / Flask API。当用户单击前端上的“下载”按钮时,我想将适当的文件下载到他们的计算机上。 我尝试过的 我目前正在使用一些代码来查找下载文件夹的路径,然后将该路径以及他们试图下载的存储桶中的文件作为第二个参数插入到download_file()中。 这在本地有效,并且测试运行良好,但是一旦部

  • 我是Google Cloud Platform的新手。我已经在datalab上训练了我的模型,并将模型文件夹保存在云存储中。我可以通过右键单击文件将桶中的现有文件下载到本地计算机-

  • 我有一个包含数据库备份的S3存储桶。我正在创建一个脚本来下载最新的备份(并最终将其还原到其他地方),但我不确定如何只从存储桶中获取最新的文件。 是否可以使用AWS CLI工具仅将最近的文件从S3存储桶复制到本地目录?

  • 问题内容: 我的目标: 显示一个对话框,提示用户保存从AWS下载的文件。 我的问题: 我目前正在使用awssum- amazon-s3创建下载流。但是,我仅设法将文件保存到服务器或将其流式传输到命令行…如您从我的代码中看到的那样,我的最后一次尝试是尝试手动设置失败的内容处置头。我无法使用res.download(),因为已经设置了标头? 我如何实现我的目标? 我的节点代码: 我的角度代码: 编写此

  • 我目前正在制作一个Minecraft Mod Loader。 正如您在上面看到的,我有一个名为Client的类。当Minecraft游戏启动时,启动被调用。现在我有一个名为Mods的文件夹,在调用startup时,我需要将Mods从Mods文件夹加载到ArrayList命名模块中。更深入地说,每个Mod将有一个继承这个模块类的主类 因此,在调用startup时,我需要遍历mods文件夹中的每个Mo