S3存储桶子文件夹对象获取失败及桶名称格式匹配报错求助
S3存储桶子文件夹对象获取失败及桶名称格式匹配报错求助
嘿,我来帮你把这个问题掰扯清楚,分分钟解决!
首先说那个桶名格式的报错——你这完全是搞混了S3桶名和对象前缀的区别!S3的桶名是绝对不能包含斜杠/的,你输入的FirstLevelS3/SecondLevelS3/BucketSource里带了好几个斜杠,直接撞在了S3桶名的正则规则上,可不就报错了嘛。
而且这里得给你纠正一个常见误区:S3里根本没有真正的“文件夹”!那些在控制台里看起来像文件夹的路径,本质上都是对象键(也就是每个文件的唯一标识)的前缀。比如你说的FirstLevelS3/SecondLevelS3/,其实是指所有键开头带有这个字符串的对象,S3只是为了方便我们理解,才把它们展示成文件夹的样子。
那怎么正确获取这个“子文件夹”下的所有对象呢?很简单,保持桶名是正确的BucketSource,然后在获取对象的时候指定前缀参数就行,修改后的代码给你贴在下面:
import boto3 bucket_from = "BucketSource" s3 = boto3.resource('s3') src = s3.Bucket(bucket_from) # 这里填你要筛选的“子文件夹”路径作为前缀 target_prefix = "FirstLevelS3/SecondLevelS3/" for archive in src.objects.filter(Prefix=target_prefix): print(archive.key)
这样运行起来,就能精准捞到所有键以FirstLevelS3/SecondLevelS3/开头的对象,也就是你想要的“子文件夹”里的内容啦。
另外补充一句:你之前用src.objects.all()能列出桶里的对象,但没看到预期的“子文件夹”内容?其实不是没列出来,而是那些对象的键里包含了前缀路径,比如FirstLevelS3/SecondLevelS3/xxx.txt,只是你没注意到而已——毕竟S3里没有真正的文件夹实体,所有内容都是平级存储的对象。
备注:内容来源于stack exchange,提问作者Jim Macaulay
相关产品推荐
相关产品推荐

