检查S3存储桶中是否存在文件夹,如果不存在则创建一个文件夹

问题描述 投票:0回答:2

我正在尝试编写一段代码,其中在 S3 存储桶中我想检查该文件夹是否存在,如果不存在,我想创建该文件夹。以下是我的代码。

def checkiffolderexists(bucket:str, path:str) -> bool:

    s3 = boto3.Session(profile_name='saml').client('s3')
    if not path.endswith('/'):
        path = path + '/'
        print(path)
    resp = s3.list_objects(Bucket=bucket, Prefix=path, Delimiter='/', MaxKeys=1)
    return 'Contents' in resp

我将以下参数传递给创建的此方法。

checkiffolderexists('star-mi-qa-ctset-delta-us-east-1','star-mi-qa-ctset-delta-us-east-1/vendor=ctset/type=own_v5/year=2022/month=10/day=01') 

star-mi-qa-ctset-delta-us-east-1 是我的存储桶名称,在其中我想检查 day=01/ 文件夹是否存在。如果没有,我想在传递给该方法的同一路径中创建该文件夹。这里的问题是,即使该文件夹存在,该方法也会返回 false。我在将参数传递给方法或代码时犯了什么错误?

python amazon-web-services boto3
2个回答
1
投票

与分隔符匹配的键不会显示在

Contents
中。

来自文档

导致在前缀和第一次出现的分隔符之间包含相同字符串的键被汇总到 CommonPrefixes 集合中的单个结果元素中。 这些卷起的密钥不会在响应中的其他位置返回

(强调我的。)

调用不带此参数的方法将会起作用:

resp = s3.list_objects(Bucket=bucket, Prefix=path, MaxKeys=1)

0
投票

对于任何搜索此论点的人,我添加一条注释: 如果您在不存在的文件夹中上传文件,则会自动创建该文件。无需搜索。

© www.soinside.com 2019 - 2024. All rights reserved.