S3桶文件夹存在性校验返回错误结果问题排查
问题分析与解决方案
两个核心问题:
- 传参错误:你调用时第二个参数重复包含了桶名,S3的路径参数是桶内的相对路径,不需要再写桶名。
- 代码逻辑错误:判断文件夹存在的条件不对,S3里的“文件夹”本质是对象键的前缀,用
Delimiter='/'调用list_objects时,空文件夹只会出现在CommonPrefixes里,而非Contents(Contents仅包含实际文件)。
修正后的代码:
def checkiffolderexists(bucket: str, path: str) -> bool: s3 = boto3.Session(profile_name='saml').client('s3') # 统一前缀格式,确保以/结尾 if not path.endswith('/'): path = path + '/' resp = s3.list_objects(Bucket=bucket, Prefix=path, Delimiter='/', MaxKeys=1) # 只要CommonPrefixes或Contents存在,就说明目标前缀(文件夹)存在 return 'CommonPrefixes' in resp or 'Contents' in resp
正确的调用方式:
checkiffolderexists( 'star-mi-qa-ctset-delta-us-east-1', 'vendor=ctset/type=own_v5/year=2022/month=10/day=01' )
补充说明:
S3本身没有真正的文件夹概念,所有“文件夹”都是对象键的前缀。当使用Delimiter='/'时,AWS会对符合前缀的路径进行分组:空文件夹会被识别为CommonPrefixes;如果文件夹下有文件,Contents会包含这些文件,同时若存在子文件夹,CommonPrefixes也会有对应条目。同时检查这两个字段才能覆盖所有“文件夹存在”的场景。
内容的提问来源于stack exchange,提问作者Pratik
相关产品推荐
相关产品推荐

