S3 resource部分文件夹未列出key,删除文件时误删文件夹问题咨询
S3文件夹无对应Key的原因
S3本身不存在原生的文件夹实体,所有内容均为键(Key)值(内容)存储的对象,控制台展示的文件夹是通过对象Key的/分隔符模拟生成的虚拟结构,你遇到的差异本质是不同路径的虚拟文件夹生成逻辑不同:
- 你看到有独立Key的account、user、Archive文件夹,是被主动创建过对应的文件夹占位对象:通常是控制台点击「新建文件夹」、或是手动调用API创建了Key为
Nightly/account/(末尾带斜杠)的空内容对象,这类对象就是你列出的高亮归档Key,你当前的代码会匹配所有前缀符合的对象,删除时会把这个占位对象一起删掉,对应的虚拟文件夹就会在控制台消失。 - opportunity、opphistory两个文件夹没有对应Key,是因为没有主动创建过对应的占位对象:比如你直接上传了Key为
Nightly/opportunity/20240501.tar.gz的文件,控制台会自动根据Key的/拆分出opportunity虚拟文件夹,但不存在独立的Nightly/opportunity/对象,所以你遍历前缀时不会匹配到这类对象,删除该路径下所有文件后,该虚拟文件夹会暂时从控制台消失,后续上传对应前缀的文件时会再次自动生成。
删文件保留文件夹的修复方案
你可以在遍历逻辑中跳过末尾带斜杠的占位对象即可,优化后代码参考:
# 前缀末尾加斜杠,避免匹配到前缀相似的其他文件夹 for archive in src.objects.filter(Prefix=f"Nightly/{folder}/"): # 跳过文件夹占位对象 if archive.key.endswith('/'): continue s3.Object(BUCKET, archive.key).delete()
内容的提问来源于stack exchange,提问作者Pyd
相关产品推荐
相关产品推荐

