Python Boto3 S3:仅列出当前目录文件,忽略子目录文件

Imr*_*ran 5 python amazon-s3 boto3

我想从前缀文件夹下载文件,而不是前缀文件夹内的子目录。我在下面运行,但它列出了前缀文件夹内的所有文件,包括子目录。我是否只能列出前缀文件夹中的文件?

bucket = aws_resource_session.Bucket(bucket_name)
for obj in bucket.objects.filter(Prefix=s3_end_point_properties["prefix"]):
    print(obj.key)
Run Code Online (Sandbox Code Playgroud)

谢谢,伊姆兰·汗

jar*_*mod 9

您可以使用较低级别的Client接口,而不是使用较高级别的 Resource 接口Bucket(它只会为您提供存储桶中所有对象的列表)。具体来说,如果您在调用list_objects_v2时包含 Delimiter 参数,则结果将返回“Contents”中给定前缀处的对象和“CommonPrefixes”中的“子文件夹”。

例子:

import boto3
s3 = boto3.client("s3")

rsp = s3.list_objects_v2(Bucket="mybucket", Prefix="myprefix/", Delimiter="/")

print("Objects:", list(obj["Key"] for obj in rsp["Contents"]))
print("Sub-folders:", list(obj["Prefix"] for obj in rsp["CommonPrefixes"]))
Run Code Online (Sandbox Code Playgroud)

示例输出Prefix="csv/"

Objects: ['csv/a.csv', 'csv/b.csv', 'csv/c.csv']
Sub-folders: ['csv/corrupt/', 'csv/complete/']
Run Code Online (Sandbox Code Playgroud)

如果不包含该Delimiter参数,则此前缀及以下前缀的所有对象都将出现在 中"Contents",例如:

Objects: ['csv/a.csv', 'csv/b.csv', 'csv/c.csv', 'csv/corrupt/d.csv', 'csv/complete/e.csv']
Run Code Online (Sandbox Code Playgroud)


Adi*_*tan 2

s3 中没有“文件夹”。想象一下根目录中的单个“文件夹”中的所有内容。文件名很长并且其中有“/”,这就是所有对象的存储方式。AWS 只是提供帮助,因为人们通常熟悉文件夹结构。

当您指定前缀时,您将获得以此开头的每个对象。您可以使用 python 的标准库进行字符串操作,以在下载之前排除您不需要的内容。

您知道每个对象都会有您的前缀,因此您可以设计一种方法首先从每个键中删除前缀,然后检查文件名中是否仍然有“/”(即 s3 键)。如果有,那么它就在文件夹或子文件夹的“内部”(我使用您用来明确说明的术语),这是您不想要的。

例如:

objects = bucket.objects.filter(Prefix=prefix)
[obj for obj in objects if '/' not in obj.key.replace(prefix,'')]
Run Code Online (Sandbox Code Playgroud)