2014-03-18 27 views
0

我正在使用botoPython来存储和检索文件以及从Amazon S3。 我需要获取directory中存在的文件列表。我知道有没有,所以我措辞像how can I get a list of all file names having same prefix?如何获得在Amazon S3上具有相同前缀的所有文件名的列表?

我的问题对于示例 - 比方说,我有如下文件 -

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

当我打电话foo("Brad")在S3目录的概念,它应该返回像一个列表这 -

files/pdf/abc.pdf 
files/pdf/abc2.pdf 
files/pdf/abc3.pdf 
files/pdf/abc4.pdf 

这样做的最佳方法是什么?

回答

1

您可以使用startswith和列表理解为这个目的如下:

paths=['Brad/files/pdf/abc.pdf','Brad/files/pdf/abc2.pdf','Brad/files/pdf/abc3.pdf','Brad/files/pdf/abc4.pdf','mybucket/files/pdf/new/','mybucket/files/pdf/new/abc.pdf','mybucket/files/pdf/2011/'] 
def foo(m): 
    return [p for p in paths if p.startswith(m+'/')] 

print foo('Brad') 

输出:

['Brad/files/pdf/abc.pdf', 'Brad/files/pdf/abc2.pdf', 'Brad/files/pdf/abc3.pdf', 'Brad/files/pdf/abc4.pdf'] 

采用分体式和filter

def foo(m): 
    return filter(lambda x: x.split('/')[0]== m, paths) 
+0

工作。 此外,如果list'paths'太大,你会建议使用上述哪种方法? – Heisenberg

+1

我更喜欢第一个。 – user3

2

用户3的做法是纯客户端解决方案。我认为它在小范围内运作良好。如果您在一个存储桶中拥有数百万个对象,则可能需要支付很多请求和带宽费用。

或者,您可以使用GET BUCKET API提供的分隔符和前缀参数来存档您的需求。文档中有很多例子,见http://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html

不用说,你可以用boto来实现这个。

相关问题