boto3가 포함 된 버킷의 내용 나열 “ls”)? 다음을 수행하십시오. import boto3 s3 =

S3의 버킷 내부에 무엇이 있는지 어떻게 알 수 boto3있습니까? (즉 "ls")?

다음을 수행하십시오.

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

보고:

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

내용을 어떻게 볼 수 있습니까?



답변

내용을 보는 한 가지 방법은 다음과 같습니다.

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


답변

이것은 ‘ls’와 비슷하지만 접두사 폴더 규칙을 고려하지 않고 버킷의 객체를 나열합니다. 키 이름의 일부인 접두사를 필터링하는 것은 독자의 몫입니다.

파이썬 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)

파이썬 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'])


답변

인증을 별도로 구성했다고 가정합니다.

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

my_bucket = s3.Bucket('bucket_name')

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


답변

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최적화는 제 기능을 추가하고있다.


답변

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))