【问题标题】:S3 show buckets last modifiedS3 显示上次修改的存储桶
【发布时间】:2022-01-09 19:41:42
【问题描述】:

我正在尝试列出 S3 存储桶中最后修改的文件以获取报告,但报告显示的是第一个修改的文件(即上传第一个文件而不是最后一个文件时)。

我正在使用这个:

top_level_folders[folder]['modified'] = obj.last_modified

并在此处添加到报告中:

report.add_row([folder[1]['name'], folder[1]['objects'], 
str(round(folder[1]['size'],2)), status, folder[1]['modified']])

我已经尝试添加

=obj.last_modified, reverse=True but keep getting invalid syntax errors.

报告是这样的:

【问题讨论】:

    标签: python amazon-web-services amazon-s3


    【解决方案1】:

    我不确定您在写入报告时正在做什么,但下面的代码将返回一个字典列表,其中包含每个存储桶的名称和最后修改文件的时间最后修改。例如,

    [
      {
        'Folder': 'bucket_1',
        'Last Modified': '2021-11-30 13:10:32+00:00'
      },
      {
        'Folder': 'bucket_2',
        'Last Modified': '2021-09-27 17:18:27+00:00'
      }
    ]
    
    import datetime
    
    import boto3
    
    s3_client = boto3.client('s3',
                             aws_access_key_id="AKXXXXXXXXXXXXXXXXXX",
                             aws_secret_access_key="YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY",
                             region_name="eu-west-2"
                             )
    
    
    def find_last_modified_file_in_bucket(bucket_name: str) -> datetime:
        last_modified = []
        for bucket_object in s3_client.list_objects(Bucket=bucket_name)["Contents"]:
            last_modified.append(bucket_object["LastModified"])
    
        return max(last_modified)
    
    
    def fetch_last_modified() -> [{}]:
        last_modified_file_by_bucket: list[{}] = []
        for bucket_name in list(map(lambda bucket: bucket["Name"], s3_client.list_buckets()["Buckets"])):
            latest_time_of_last_modified_file: datetime = find_last_modified_file_in_bucket(bucket_name)
            last_modified_file_by_bucket.append(
                {
                    "Folder": bucket_name,
                    "Last Modified": str(latest_time_of_last_modified_file)
                }
            )
    
        return last_modified_file_by_bucket
    

    如果没有源代码或 folder 类型的知识,我无法确定您将如何使用上述代码更新文件夹,但很可能归结为迭代返回的 dict通过fetch_last_modified()。例如,

    def update_report(report: Report, folder_with_last_modified: dict):
        for folder in folder_with_last_modified:
            report.add_row(folder['Folder'], folder['Last Modified'])
    
    
    folder_with_last_modified = fetch_last_modified()
    update_report(report, folder_with_last_modified)
    

    【讨论】:

    • 感谢 Blair,我添加了报告的屏幕截图,可以更好地解释我正在尝试做的事情。
    • 所以“Folder”是存储桶名称,“Last Modified”是该存储桶中最后修改文件的最后修改时间?
    • 是的,但正如您所见,它向我显示了存储桶中的第一个修改文件,而不是最后一个。
    • 更新了我的答案以匹配您电子表格上的列标题,但如果不知道 folder 的来源,我无法给出完整的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-16
    • 1970-01-01
    • 2021-04-26
    • 1970-01-01
    • 1970-01-01
    • 2017-11-18
    • 2021-12-27
    相关资源
    最近更新 更多