boto3가 포함 된 버킷의 내용 나열


198

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

다음을 수행하십시오.

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

보고:

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

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

답변:


243

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

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.
oliland

100

이것은 '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'])

39
접두사도 사용하려면 다음과 같이하면됩니다.conn.list_objects(Bucket='bucket_name', Prefix='prefix_string')['Contents']
markonovak

13
처음 1000 개의 키만 나열됩니다. docstring에서 : "버킷에있는 객체의 일부 또는 전부 (최대 1000 개)를 반환합니다." 또한 list_objects 대신 list_objects_v2를 사용하는 것이 좋습니다 (그러나 처음 1000 개 키만 반환 함).
Brett Widmeier

3
이 제한 사항은 페이지 매김
v25

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

6
소스 제어에 비밀을 커밋해야합니다. 안좋다.
jan groth 1 월 41 일

2
이 답변은 모든 boto 리소스에 공통적이며 좋지 않은 보안 현명한 관련없는 인증 방법을 추가하는 동안 객체 나열의 API / 메커니즘에 대해서는 아무 것도 추가하지 않습니다.
Froyke

보안에 대한 답변에 면책 조항을 추가했습니다.
rjurney

Vault (Hashicorp)와 같은 키 / 비밀 관리 시스템에서 키를 제공 한 경우 ~ / .aws / credentials에 자격 증명 파일을 배치하는 것보다 낫지 않습니까?
SunnyAk

26

큰 키 목록을 처리하기 위해 (즉, 디렉토리 목록이 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()파일 목록을 반환 하려면 두 번째 코드의 생성기를 래핑해야한다고 덧붙입니다 .
Richard 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로 낮아 졌는지 설명해 주시겠습니까? 당신의 교정은 전혀 관련이 없을뿐만 아니라 실제로는 사소한 것이지, 그렇지 않습니까? 유치한 수정보다는 컨텐츠에 집중하십시오. 가장 의무적 인 olboy
Daniel Vieira

이들은 서로 다른 두 가지 상호 작용이었습니다. 1. 작은 맞춤법 오류에도 권장되는 답변을 수정했습니다. 나는 사소한 것과 사소한 것의 경계가 모호하다는 것에 동의합니다. 나는 오류를 보고이 경우를하지 않았기 때문에 게시물을 downvote하지 않습니다. 나는 단순히 내가 본 모든 오류를 수정합니다.
petezurich

2. 나는 당신 files_in_s3이 "목록 객체"라고 썼기 때문에 당신의 대답을 하향 표명했습니다 . 파이썬에는 그런 것이 없습니다. 오히려 iterable이며 코드를 작동시킬 수 없어서 하향 조정되었습니다. 내가 오류를 발견하고 요점을 보았지만 내 downvote를 취소 할 수 없었습니다.
petezurich

5
@petezurich 문제 없음, 파이썬에서 목록은 객체입니다. 파이썬의 거의 모든 것이 객체이기 때문에 목록은 객체입니다. 목적! 그렇기 때문에 나는 당신의 downvote를 이해하지 못했습니다. 당신은 올바른 것을 투표하고 작동하는 코드를 내리고있었습니다. 어쨌든 사과와 최선을 다해 주셔서 감사합니다
Daniel Vieira

1
@petezurich 파이썬의 모든 것은 객체입니다. "목록 객체"는 완전히 허용됩니다.
Zach Garwood

4

ObjectSummary :

ObjectSummary에 첨부 된 두 가지 식별자가 있습니다.

  • bucket_name

boto3 S3 : ObjectSummary

AWS S3 설명서의 객체 키에 대한 추가 정보 :

객체 키 :

객체를 생성 할 때 버킷에서 객체를 고유하게 식별하는 키 이름을 지정합니다. 예를 들어 Amazon S3 콘솔 (AWS Management Console 참조)에서 버킷을 강조 표시하면 버킷의 객체 목록이 나타납니다. 이 이름은 객체 키입니다. 키 이름은 UTF-8 인코딩의 길이가 최대 1024 바이트 인 유니 코드 문자 시퀀스입니다.

Amazon S3 데이터 모델은 단순한 구조입니다. 버킷을 생성하면 버킷이 객체를 저장합니다. 하위 버킷 또는 하위 폴더의 계층 구조는 없습니다. 그러나 Amazon S3 콘솔처럼 키 이름 접두사와 구분 기호를 사용하여 논리적 계층을 유추 할 수 있습니다. Amazon S3 콘솔은 폴더 개념을 지원합니다. 버킷 (관리자가 만든)에 다음 객체 키가있는 4 개의 객체가 있다고 가정합니다.

개발 / 프로젝트 1.xls

재무 / 명제 1.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 __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

버킷의 모든 파일이 나열됩니다. 문제는 어떻게 하는가 ls입니다. 어떻게 하시겠습니까? 루트에서만 파일을 인쇄하십시오
Herman

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으로 유지 될 수 있으며 method는 버킷 루트의 즉시 내용을 나열합니다.


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']

0

그래서 당신은 aws s3 lsboto3 와 동등한 것을 요구하고 있습니다. 모든 최상위 폴더와 파일이 나열됩니다. 이것은 내가 얻을 수있는 가장 가까운 것입니다. 모든 최상위 폴더 만 나열됩니다. 그렇게 간단한 조작이 얼마나 어려운지 놀랍습니다.

import boto3

def s3_ls():
  s3 = boto3.resource('s3')
  bucket = s3.Bucket('example-bucket')
  result = bucket.meta.client.list_objects(Bucket=bucket.name,
                                           Delimiter='/')
  for o in result.get('CommonPrefixes'):
    print(o.get('Prefix'))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.