2015-09-17 19 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を使用したい場合がありも結果かかわらず、反復処理するために必要とされるかもしれない他の引数をサポートしています、デリミタ、エンコーディングタイプ、マーカー、マックスキー、プレフィックス

+1

私はそれを試みましたが、同じClientErrorを取得します。 ListObjects操作を呼び出すときにエラー(NoSuchKey)が発生しました:指定されたキーが存在しません。 –

+0

このメソッドは、最大1000件の結果しか返しません。 – Trein

7

セッションをお持ちの場合は、 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の応答にコメントを追加するには十分な評判はありませんが、正しいと思われます。

@Vor:

client = boto3.client('s3') 

OP:

s3 = session.resource('s3') 

この場合は、その例とOPとの違いは、OPがS3リソースを呼び出している間に@VorがS3クライアントを呼び出していることです+1 @ Vorの投稿に役立ちます。

+0

投稿に有益な情報がない他の人の広告 – ViaSat

関連する問題