S3でバケットの内容を確認するにはどうすればよいboto3
ですか?(つまり、"ls"
)
以下を実行します。
import boto3
s3 = boto3.resource('s3')
my_bucket = s3.Bucket('some/path/')
戻り値:
s3.Bucket(name='some/path/')
内容はどのように確認できますか?
S3でバケットの内容を確認するにはどうすればよいboto3
ですか?(つまり、"ls"
)
以下を実行します。
import boto3
s3 = boto3.resource('s3')
my_bucket = s3.Bucket('some/path/')
戻り値:
s3.Bucket(name='some/path/')
内容はどのように確認できますか?
回答:
内容を確認する1つの方法は次のとおりです。
for my_bucket_object in my_bucket.objects.all():
print(my_bucket_object)
mybucket.objects.filter(Prefix='foo/bar')
あり、それはそのプレフィックスを持つオブジェクトのみをリストします。Delimiter
パラメータを渡すこともできます。
object
グローバルタイプをシャドウするため、変数名として使用しないことをお勧めしますobject
。
これは「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'])
conn.list_objects(Bucket='bucket_name', Prefix='prefix_string')['Contents']
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)
大きなキーリストを処理するために(つまり、ディレクトリリストが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
私の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
最適化は、最初の関数に追加されました。
list()
ファイルのリストを返すには、2番目のコードのジェネレーターをラップする必要があることを付け加えます。
より簡潔な方法では、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))
files_in_s3
「リストオブジェクト」であると書いたので、私はあなたの回答に反対票を投じました。Pythonにはそのようなものはありません。それはむしろ反復可能であり、私はあなたのコードを機能させることができなかったため、反対票を投じました。私はエラーを見つけてあなたの要点を見ましたが、私の反対票を取り消すことができませんでした。
ObjectSummary:
ObjectSummaryに添付される2つの識別子があります。
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
参照:
以下は、バケット名とオブジェクトキーを取得する方法を示すサンプルコードです。
例:
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()
私は、認証方法を含めて、次のようにしました。
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
#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)
上記のコメントの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のままにすることができ、メソッドはバケットのルートの直接のコンテンツをリストします。
boto3のインポート
s3 = boto3.resource( 's3')
BUCKET_NAME = 'S3バケット名(例:' deletemetesting11 ')
allFiles = s3.Bucket(BUCKET_NAME).objects.all()
allFiles内のファイルの場合:print(file.key)