boto3を使用したバケットの内容の一覧表示


198

S3でバケットの内容を確認するにはどうすればよいboto3ですか?(つまり、"ls"

以下を実行します。

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

戻り値:

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

内容はどのように確認できますか?

回答:


241

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

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

1
バケット内の特定のパスの下、またはboto3を使用して特定の区切り文字でキーをフェッチできますか?
Rahul KP

109
あなたは言うことができるはずでmybucket.objects.filter(Prefix='foo/bar')あり、それはそのプレフィックスを持つオブジェクトのみをリストします。Delimiterパラメータを渡すこともできます。
garnaat

3
boto3 AttributeErrorで機能しない: 'S3'オブジェクトには属性 'objects'がありません
Shek

2
@garnaatフィルターメソッドについてのコメントは本当に役に立ちました(私のコードはよりシンプルで高速になりました)。ありがとうございます。
エドワードディクソン

24
objectグローバルタイプをシャドウするため、変数名として使用しないことをお勧めしますobject
オリランド

100

これは「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'])

39
:あなたにも接頭辞を使用する場合は、このようにそれを行うことができますconn.list_objects(Bucket='bucket_name', Prefix='prefix_string')['Contents']
markonovak

13
これは最初の1000個の鍵のみをリストします。docstringから:「バケット内のオブジェクトの一部またはすべて(最大1000)を返します。」また、list_objectsの代わりにlist_objects_v2を使用することをお勧めします(ただし、これも最初の1000個のキーのみを返します)。
Brett Widmeier、2018年

3
この制限は、Paginators
v25 '20

44

認証を個別に構成していることを前提としています。

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

my_bucket = s3.Bucket('bucket_name')

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

30

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)

13
これは、〜/ .aws / credentialsに認証情報ファイルを置くよりも安全性が低くなります。それは有効な解決策ですが。
nu everest 2017

6
これには、シークレットをソース管理にコミットする必要があります。良くない。
Jan Groth

2
この答えは、すべてのbotoリソースに対して共通であり、賢明な悪い習慣のセキュリティである非関連の認証方法を追加しながら、オブジェクトをリストのAPI /力学について何も加えない
Froyke

セキュリティに関する回答に免責事項を追加しました。
rjurney

Vault(Hashicorp)のようなキー/シークレット管理システムによってキーが提供された場合はどうなりますか?単に〜/ .aws / credentialsに資格情報ファイルを配置するよりも良いでしょうか?
SunnyAk

25

大きなキーリストを処理するために(つまり、ディレクトリリストが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

20

私のs3 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最適化は、最初の関数に追加されました。


これは断然最良の答えです。下にスクロールしたとき、@ Hephaestusの回答を変更していました(最高だったため)。これは受け入れられる答えであり、簡潔にするために追加のポイントを取得する必要があります。list()ファイルのリストを返すには、2番目のコードのジェネレーターをラップする必要があることを付け加えます。
リチャードD

@RichardD両方の結果がジェネレータを返します。このコードで対象とする多くのバケットには、コードエグゼキュータのメモリが一度に処理できるよりも多くのキーがあります(AWS Lambdaなど)。生成されたキーを使用することを好みます。
Sean Summers

6

より簡潔な方法では、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))

3
@petezurich、なぜ私の回答のそのような小さな編集-私の回答の最初の「a」を大文字の「A」で置き換えるかによって私の評判が-2低下した理由を説明してもらえますか?それはあなたの訂正が全く関係がないだけでなく、実際にはささいなことだと思いませんか?幼稚な改訂ではなくコンテンツに焦点を当ててください。最も義務付けられているol'boy
Daniel Vieira

これらは2つの異なる相互作用でした。1.マイナーなスペルミスにもお勧めする回答を編集しました。マイナーとささいなことの境界線があいまいであることに同意します。エラーが表示され、この場合はしなかったため、投稿に反対票を投じません。表示されたすべてのエラーを修正するだけです。
petezurich

2.あなたがfiles_in_s3「リストオブジェクト」であると書いたので、私はあなたの回答に反対票を投じました。Pythonにはそのようなものはありません。それはむしろ反復可能であり、私はあなたのコードを機能させることができなかったため、反対票を投じました。私はエラーを見つけてあなたの要点を見ましたが、私の反対票を取り消すことができませんでした。
petezurich

5
@petezurichは問題ありません、あなたの、ポイント、ただ1つのことを理解しました。Pythonではリストはオブジェクトであるため、Pythonのほとんどすべてがオブジェクトなので、リストも反復可能ですが、何よりもまず、それはオブジェクト!それが私があなたの反対票を理解しなかった理由です-あなたは正しい何かと機能するコードに反対票を投じていました。とにかく、お詫びとすべてに感謝します
ダニエル・ビエラ

1
@petezurich Pythonのすべてがオブジェクトです。「リストオブジェクト」は完全に許容されます。
ザックガーウッド

4

ObjectSummary:

ObjectSummaryに添付される2つの識別子があります。

  • バケット名
  • キー

boto3 S3:ObjectSummary

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

オブジェクトキー:

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

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

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

Finance / statement1.pdf

Private / 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 __name__ == '__main__':
    main()

3

私は、認証方法を含めて、次のようにしました。

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

2
#To print all filenames in a bucket
import boto3

s3 = boto3.client('s3')

def get_s3_keys(bucket):

    """Get a list of keys in an S3 bucket."""
    resp = s3.list_objects_v2(Bucket=bucket)
    for obj in resp['Contents']:
      files = obj['Key']
    return files


filename = get_s3_keys('your_bucket_name')

print(filename)

#To print all filenames in a certain directory in a bucket
import boto3

s3 = boto3.client('s3')

def get_s3_keys(bucket, prefix):

    """Get a list of keys in an S3 bucket."""
    resp = s3.list_objects_v2(Bucket=bucket, Prefix=prefix)
    for obj in resp['Contents']:
      files = obj['Key']
      print(files)
    return files


filename = get_s3_keys('your_bucket_name', 'folder_name/sub_folder_name/')

print(filename)

「get_s3_keys」はどちらも最後のキーのみを返します。
Alexey Vazhnov

1

上記のコメントの1つで@Hephaeastusのコードにほとんど変更を加えずに、以下のメソッドを記述して、指定されたパスのフォルダーとオブジェクト(ファイル)を一覧表示します。s3 lsコマンドと同様に機能します。

from boto3 import session

def s3_ls(profile=None, bucket_name=None, folder_path=None):
    folders=[]
    files=[]
    result=dict()
    bucket_name = bucket_name
    prefix= folder_path
    session = boto3.Session(profile_name=profile)
    s3_conn   = session.client('s3')
    s3_result =  s3_conn.list_objects_v2(Bucket=bucket_name, Delimiter = "/", Prefix=prefix)
    if 'Contents' not in s3_result and 'CommonPrefixes' not in s3_result:
        return []

    if s3_result.get('CommonPrefixes'):
        for folder in s3_result['CommonPrefixes']:
            folders.append(folder.get('Prefix'))

    if s3_result.get('Contents'):
        for key in s3_result['Contents']:
            files.append(key['Key'])

    while s3_result['IsTruncated']:
        continuation_key = s3_result['NextContinuationToken']
        s3_result = s3_conn.list_objects_v2(Bucket=bucket_name, Delimiter="/", ContinuationToken=continuation_key, Prefix=prefix)
        if s3_result.get('CommonPrefixes'):
            for folder in s3_result['CommonPrefixes']:
                folders.append(folder.get('Prefix'))
        if s3_result.get('Contents'):
            for key in s3_result['Contents']:
                files.append(key['Key'])

    if folders:
        result['folders']=sorted(folders)
    if files:
        result['files']=sorted(files)
    return result

これにより、指定されたパス内のすべてのオブジェクト/フォルダーが一覧表示されます。Folder_pathはデフォルトでNoneのままにすることができ、メソッドはバケットのルートの直接のコンテンツをリストします。


0

これが解決策です

boto3のインポート

s3 = boto3.resource( 's3')

BUCKET_NAME = 'S3バケット名(例:' deletemetesting11 ')

allFiles = s3.Bucket(BUCKET_NAME).objects.all()

allFiles内のファイルの場合:print(file.key)


0

次のように行うこともできます。

csv_files = s3.list_objects_v2(s3_bucket_path)
    for obj in csv_files['Contents']:
        key = obj['Key']
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.