2015-03-31 44 views
-1

我在测试目录的S3桶与成千上万密钥: 迭代通过与每个键:如何获得正确的s3键?

for key in bucket.list(): 
    print key.name 

息率等输出:

“/ DIR2/DIR2 /香蕉/ dir4/file1的” “/ dir1/dir2 /苹果/ dir4 /文件2”

问题是,当我迭代这样,它是非常缓慢的,如果我想要的是所有键的列表“/ dir1/dir2 /苹果” 。另外,如果没有符合这个标准的密钥,它会非常慢,因为它似乎遍历所有密钥。

什么是正确的方法来获得我想要的桶内的密钥列表?

回答

2

中查找delimiterprefix参数在docs

for files in bucket.get_all_keys(delimiter = '/', prefix = '/dir1/dir2/'): 
    print files 

虽然delimiter将永远是/prefix可以设置为你喜欢这取决于你想从

+0

你可以逃脱领先'/'前缀(IIRC,S3是有点宽松这里),但在技术上,不像一个文件系统,在S3键桶的根实际上并不以'/'开头。由于它是一个“前缀”,因此不需要将其锚定到左侧。但是,最后的斜线绝对是正确的,并且经常被忽略。 +1。 – 2015-04-01 02:09:50

0
from boto.s3.connection import S3Connection 

conn = S3Connection() # assumes your .boto is populated with keys 

bucket = conn.get_bucket('bucketname') 

theobjects = [key.name for key in bucket.get_all_keys() if  key.name.startswith('dir1/dir2/apple')] 

print theobjects # should return just the names in a list (unicode) 
读取文件的位置什么

当然这假定它是最初的前缀,如果你想搜索一个包含一个字符串,你需要升级到正则表达式(不是知道str.find会为你工作)

import re 
theobjects = [key.name for key in bucket.get_all_keys() if re.search('/dir1/dir2/apple', key.name)]