我在测试目录中有一个包含数千个密钥的S3存储桶: 通过以下方式遍历每个键:
for key in bucket.list():
print key.name
产量输出如:
“/ DIR2 / DIR2 /香蕉/ dir4 / file1的” “/ DIR1 / DIR2 /苹果/ dir4 / file2的”
问题是当我像这样迭代时,如果我想要的是具有“/ dir1 / dir2 / apple”的所有键的列表,则它非常慢。此外,如果没有符合此条件的键,则它非常慢,因为它似乎迭代所有键。
获取我想要的桶内密钥列表的正确方法是什么?
答案 0 :(得分:2)
在docs
中查找delimiter
和prefix
个参数
for files in bucket.get_all_keys(delimiter = '/', prefix = '/dir1/dir2/'):
print files
虽然delimiter
始终为/
,但prefix
可以设置为您喜欢的任何内容,具体取决于您要从中读取文件的位置
答案 1 :(得分: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)]