如何使用python b获得amazon S3中的文件夹列表

2024-06-26 00:02:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用boto、python和amazon s3。

如果我用

[key.name for key in list(self.bucket.list())]

然后我拿到所有文件的钥匙。

mybucket/files/pdf/abc.pdf
mybucket/files/pdf/abc2.pdf
mybucket/files/pdf/abc3.pdf
mybucket/files/pdf/abc4.pdf
mybucket/files/pdf/new/
mybucket/files/pdf/new/abc.pdf
mybucket/files/pdf/2011/

什么是最好的方法

1. either get all folders from s3
2. or from that list just remove the file from the last and get the unique keys of folders

我想这样做

set([re.sub("/[^/]*$","/",path) for path in mylist]

Tags: thepathkeyinfromnewforget
3条回答

根据sethwm的回答:

要获取顶级目录:

list(bucket.list("", "/"))

要获取files的子目录:

list(bucket.list("files/", "/")

等等。

这将是一个不完整的答案,因为我不知道python或boto,但我想评论一下这个问题的基本概念。

其他海报之一是对的:S3中没有目录的概念。只有平键/值对。许多应用程序假装某些分隔符表示目录条目。例如“/”或“\”。有些应用甚至把一个虚拟文件放在适当的位置,这样如果“目录”清空了,你仍然可以在列表结果中看到它。

你不必总是把整个桶都拉下来,在本地进行过滤。S3有一个分隔列表的概念,在这个列表中,您可以指定您认为的路径分隔符(“/”、“\”、“|”、“foobar”等),S3将向您返回虚拟结果,这与您想要的类似。

http://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html( 看看分隔符头。)

这个API将为您提供一级目录。如果你在你的例子中有:

mybucket/files/pdf/abc.pdf
mybucket/files/pdf/abc2.pdf
mybucket/files/pdf/abc3.pdf
mybucket/files/pdf/abc4.pdf
mybucket/files/pdf/new/
mybucket/files/pdf/new/abc.pdf
mybucket/files/pdf/2011/

如果您传入一个带有前缀“”和分隔符“/”的列表,将得到以下结果:

mybucket/files/

如果您传入一个前缀为“mybucket/files/”和分隔符“/”的列表,将得到以下结果:

mybucket/files/pdf/

如果您传入一个前缀为“mybucket/files/pdf/”和分隔符“/”的列表,您将得到以下结果:

mybucket/files/pdf/abc.pdf
mybucket/files/pdf/abc2.pdf
mybucket/files/pdf/abc3.pdf
mybucket/files/pdf/abc4.pdf
mybucket/files/pdf/new/
mybucket/files/pdf/2011/

如果您想从结果集中删除pdf文件本身,那么在这一点上您将是独立的。

现在你在python/boto中是怎么做到的,我不知道。希望有办法通过。

正如jam建议的注释方法之一所指出的那样,返回一个前缀对象。如果您在一个名称/路径之后,则可以使用variablename。例如:

import boto
import boto.s3

conn = boto.s3.connect_to_region('us-west-2')
bucket = conn.get_bucket(your_bucket)

folders = bucket.list("","/")
for folder in folders:
    print folder.name

相关问题 更多 >