2015-09-17 67 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

相關問題