18

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.

バケット内のディレクトリを一覧表示する正しい方法は何ですか?

4

6 に答える 6

11

または、使用したい場合がありますboto3.client

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

list_objects結果を反復処理するために必要になる可能性のある他の引数もサポートしています: Bucket、Delimiter、EncodingType、Marker、MaxKeys、Prefix

于 2015-09-17T17:01:03.123 に答える
0

バケット名にスラッシュを含めることはできないと思っていたでしょう。バケット内のすべてのディレクトリを一覧表示する必要があるとしますが、コードは多数のバケット内のすべてのコンテンツ (必ずしもディレクトリとは限りません) を一覧表示しようとします。これらのバケットはおそらく存在しません (名前が不正であるため)。だからあなたが走るとき

bucket = s3.Bucket(name)

バケットはおそらく null であり、後続のリストは失敗します。

于 2016-02-15T23:30:07.040 に答える