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/')
내용을 어떻게 볼 수 있습니까?
답변:
내용을 보는 한 가지 방법은 다음과 같습니다.
for my_bucket_object in my_bucket.objects.all():
print(my_bucket_object)
mybucket.objects.filter(Prefix='foo/bar')
접두사가있는 객체 만 나열됩니다. Delimiter
매개 변수를 전달할 수도 있습니다 .
object
는 글로벌 유형을 그림자하므로 변수 이름으로 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'])
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()
파일 목록을 반환 하려면 두 번째 코드의 생성기를 래핑해야한다고 덧붙입니다 .
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
이 "목록 객체"라고 썼기 때문에 당신의 대답을 하향 표명했습니다 . 파이썬에는 그런 것이 없습니다. 오히려 iterable이며 코드를 작동시킬 수 없어서 하향 조정되었습니다. 내가 오류를 발견하고 요점을 보았지만 내 downvote를 취소 할 수 없었습니다.
ObjectSummary :
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
참고:
버킷 이름과 객체 키를 얻는 방법을 보여주는 예제 코드는 다음과 같습니다.
예:
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)
ls
입니다. 어떻게 하시겠습니까? 루트에서만 파일을 인쇄하십시오
위의 주석 중 하나에서 @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는 버킷 루트의 즉시 내용을 나열합니다.
그래서 당신은 aws s3 ls
boto3 와 동등한 것을 요구하고 있습니다. 모든 최상위 폴더와 파일이 나열됩니다. 이것은 내가 얻을 수있는 가장 가까운 것입니다. 모든 최상위 폴더 만 나열됩니다. 그렇게 간단한 조작이 얼마나 어려운지 놀랍습니다.
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'))