web-dev-qa-db-ja.com

boto3でバケットの内容を一覧表示する

boto3を使ってS3のバケツの中身を確認する方法(つまり"ls")?

次のようにします。

import boto3
s3 = boto3.resource('s3')
my_bucket = s3.Bucket('some/path/')

以下を返します。

s3.Bucket(name='some/path/')

その内容はどうやって見るのですか?

123

内容を確認する1つの方法は次のとおりです。

for my_bucket_object in my_bucket.objects.all():
    print(my_bucket_object)
158
garnaat

これは 'ls'に似ていますが、プレフィックスフォルダの規則を考慮に入れず、バケット内のオブジェクトをリストします。キー名の一部であるプレフィックスを除外するのは読者に任されています。

Python 2では:

from boto.s3.connection import S3Connection

conn = S3Connection() # assumes boto.cfg setup
bucket = conn.get_bucket('bucket_name')
for obj in bucket.get_all_keys():
    print(obj.key)

Python 3では:

from boto3 import client

conn = client('s3')  # again assumes boto.cfg setup, assume AWS S3
for key in conn.list_objects(Bucket='bucket_name')['Contents']:
    print(key['Key'])
76
cgseller

認証を個別に設定したとします。

import boto3
s3 = boto3.resource('s3')

my_bucket = s3.Bucket('bucket_name')

for file in my_bucket.objects.all():
    print file.key
24
Tushar Niras

ACCESSキーとSECRETキーを渡したい場合(これは安全ではないため、行ってはいけません):

from boto3.session import Session

ACCESS_KEY='your_access_key'
SECRET_KEY='your_secret_key'

session = Session(aws_access_key_id=ACCESS_KEY,
                  aws_secret_access_key=SECRET_KEY)
s3 = session.resource('s3')
your_bucket = s3.Bucket('your_bucket')

for s3_file in your_bucket.objects.all():
    print(s3_file.key)
21
Erwin Alberto

大きなキーリストを処理するために(つまりディレクトリリストが1000アイテムを超える場合)、次のコードを使用して複数のリストを含むキー値(つまりファイル名)を累積しました(最初の行については上記のAmelioに感謝)。コードはpython3用です。

    from boto3  import client
    bucket_name = "my_bucket"
    prefix      = "my_key/sub_key/lots_o_files"

    s3_conn   = client('s3')  # type: BaseClient  ## again assumes boto.cfg setup, assume AWS S3
    s3_result =  s3_conn.list_objects_v2(Bucket=bucket_name, Prefix=prefix, Delimiter = "/")

    if 'Contents' not in s3_result:
        #print(s3_result)
        return []

    file_list = []
    for key in s3_result['Contents']:
        file_list.append(key['Key'])
    print(f"List count = {len(file_list)}")

    while s3_result['IsTruncated']:
        continuation_key = s3_result['NextContinuationToken']
        s3_result = s3_conn.list_objects_v2(Bucket=bucket_name, Prefix=prefix, Delimiter="/", ContinuationToken=continuation_key)
        for key in s3_result['Contents']:
            file_list.append(key['Key'])
        print(f"List count = {len(file_list)}")
    return file_list
13
Hephaestus

My s 3 keysユーティリティ関数 は、基本的に@ Hephaestusの答えを最適化したものです。

import boto3


s3_paginator = boto3.client('s3').get_paginator('list_objects_v2')


def keys(bucket_name, prefix='/', delimiter='/', start_after=''):
    prefix = prefix[1:] if prefix.startswith(delimiter) else prefix
    start_after = (start_after or prefix) if prefix.endswith(delimiter) else start_after
    for page in s3_paginator.paginate(Bucket=bucket_name, Prefix=prefix, StartAfter=start_after):
        for content in page.get('Contents', ()):
            yield content['Key']

私のテスト(boto3 1.9.84)では、同等の(しかしもっと単純な)コードよりかなり速いです:

import boto3


def keys(bucket_name, prefix='/', delimiter='/'):
    prefix = prefix[1:] if prefix.startswith(delimiter) else prefix
    bucket = boto3.resource('s3').Bucket(bucket_name)
    return (_.key for _ in bucket.objects.filter(Prefix=prefix))

S3はUTF-8バイナリソート結果 を保証するので、start_after最適化が最初の関数に追加されました。

6
Sean Summers

もっと倹約的な方法では、forループを介して繰り返すのではなく、S3バケット内のすべてのファイルを含む元のオブジェクトを印刷することもできます。

session = Session(aws_access_key_id=aws_access_key_id,aws_secret_access_key=aws_secret_access_key)
s3 = session.resource('s3')
bucket = s3.Bucket('bucket_name')

files_in_s3 = bucket.objects.all() 
#you can print this iterable with print(list(files_in_s3))
5
Daniel Vieira

ObjectSummary:

ObjectSummaryに添付されている2つのIDがあります。

  • bucket_name
  • キー

boto3 S3:ObjectSummary

AWS S3ドキュメントのオブジェクトキーの詳細:

オブジェクトキー:

オブジェクトを作成するときには、バケット内のオブジェクトを一意に識別するキー名を指定します。たとえば、Amazon S3コンソール(「AWSマネジメントコンソール」を参照)で、バケットを強調表示すると、バケット内のオブジェクトのリストが表示されます。これらの名前はオブジェクトキーです。キーの名前は、UTF-8エンコードの長さが最大1024バイトのUnicode文字のシーケンスです。

Amazon S3データモデルはフラットな構造です。バケットを作成し、そのバケットにオブジェクトを格納します。サブバケットやサブフォルダの階層はありません。ただし、Amazon S3コンソールと同様に、キー名のプレフィックスと区切り文字を使用して論理階層を推測できます。 Amazon S3コンソールはフォルダーの概念をサポートしています。バケット(管理者作成)に次のオブジェクトキーを持つ4つのオブジェクトがあるとします。

開発/プロジェクト1.xls

ファイナンス/ statement1.pdf

非公開/ taxdocument.pdf

s3-dg.pdf

参照:

AWS S3:オブジェクトキー

これは、バケット名とオブジェクトキーを取得する方法を示すコード例です。

例:

import boto3
from pprint import pprint

def main():

    def enumerate_s3():
        s3 = boto3.resource('s3')
        for bucket in s3.buckets.all():
             print("Name: {}".format(bucket.name))
             print("Creation Date: {}".format(bucket.creation_date))
             for object in bucket.objects.all():
                 print("Object: {}".format(object))
                 print("Object bucket_name: {}".format(object.bucket_name))
                 print("Object key: {}".format(object.key))

    enumerate_s3()


if __== '__main__':
    main()
2
Gothburz

認証方法も含めて、このようにしました。

s3_client = boto3.client(
                's3',
                aws_access_key_id='access_key',
                aws_secret_access_key='access_key_secret',
                config=boto3.session.Config(signature_version='s3v4'),
                region_name='region'
            )

response = s3_client.list_objects(Bucket='bucket_name', Prefix=key)
if ('Contents' in response):
    # Object / key exists!
    return True
else:
    # Object / key DOES NOT exist!
    return False
1
Milean