2015-09-17 52 views
9

我想列出使用Python和Boto3的S3存储桶中的所有目录。如何使用Python和Boto3列出S3存储桶的目录内容?

我使用下面的代码:

s3 = session.resource('s3') # I already have a boto3 Session object 
bucket_names = [ 
    'this/bucket/', 
    'that/bucket/' 
] 
for name in bucket_names: 
    bucket = s3.Bucket(name) 
    for obj in bucket.objects.all(): # this raises an exception 
     # handle obj 

当我运行此我得到下面的异常堆栈跟踪:

File "botolist.py", line 67, in <module> 
    for obj in bucket.objects.all(): 
File "/Library/Python/2.7/site-packages/boto3/resources/collection.py", line 82, in __iter__ 
    for page in self.pages(): 
File "/Library/Python/2.7/site-packages/boto3/resources/collection.py", line 165, in pages 
    for page in pages: 
File "/Library/Python/2.7/site-packages/botocore/paginate.py", line 83, in __iter__ 
    response = self._make_request(current_kwargs) 
File "/Library/Python/2.7/site-packages/botocore/paginate.py", line 155, in _make_request 
    return self._method(**current_kwargs) 
File "/Library/Python/2.7/site-packages/botocore/client.py", line 270, in _api_call 
    return self._make_api_call(operation_name, kwargs) 
File "/Library/Python/2.7/site-packages/botocore/client.py", line 335, in _make_api_call 
    raise ClientError(parsed_response, operation_name) 

botocore.exceptions.ClientError: An error occurred (NoSuchKey) when calling the ListObjects operation: The specified key does not exist. 

什么是列出一个桶内目录正确的方法是什么?

提前感谢...

回答

9

另外,您可能需要使用boto3.client

>>> import boto3 
>>> client = boto3.client('s3') 
>>> client.list_objects(Bucket='MyBucket') 

list_objects还支持可能需要迭代虽然结果的其它参数:铲斗,分隔符,EncodingType,标记,MaxKeys,前缀

+1

我试过了,但仍然得到相同的ClientError。调用ListObjects操作时发生错误(NoSuchKey):指定的键不存在。 –

+0

此方法仅返回1000个结果。 – Trein

7

如果您有会话,则创建ac lient并获得客户list_objectsCommonPrefixes

client = session.client('s3', 
         # region_name='eu-west-1' 
         ) 

result = client.list_objects(Bucket='MyBucket', Delimiter='/') 
for obj in result.get('CommonPrefixes'): 
    #handle obj.get('Prefix') 

可能有很多文件夹,你可能希望在子文件夹开始,虽然。像这样的东西可以处理:

def folders(client, bucket, prefix=''): 
    paginator = client.get_paginator('list_objects') 
    for result in paginator.paginate(Bucket=bucket, Prefix=prefix, Delimiter='/'): 
     for prefix in result.get('CommonPrefixes', []): 
      yield prefix.get('Prefix') 

gen_folders = folders(client, 'MyBucket') 
list(gen_folders) 

gen_subfolders = folders(client, 'MyBucket', prefix='MySubFolder/') 
list(gen_subfolders) 
+0

这只是为我节省了大量的时间。感谢那个功能。 – MrMauricioLeite

+0

嘿,亚马逊!添加这个功能,PLZ!我不明白为什么它不是图书馆的一部分。 – rdllopes

1

我原以为你不能在一个桶名称中有一个斜杠。你说你想列出一个桶中的所有目录,但是你的代码试图列出一些桶内的所有内容(不一定是目录)。这些桶可能不存在(因为它们具有非法名称)。所以当你运行时

bucket = s3.Bucket(name) 

桶可能是空的,随后的列表将失败。

-1

我知道这是旧的,但我偶然发现,并想澄清谁找到它的人。

我没有足够的声望给@ Vor的回复添加评论,但看起来是正确的。他们的榜样和OP之间的区别是,@Vor呼吁S3客户端,而OP是调用S3资源:

@Vor:

client = boto3.client('s3') 

OP:

s3 = session.resource('s3') 

如果这对你有帮助,+1 @ Vor的帖子。

+0

不知道为什么广告为他人在帖子中没有有利的信息 – ViaSat

相关问题