[python] boto3를 사용하여 s3의 버킷에 키가 있는지 확인하십시오.

boto3에 키가 있는지 알고 싶습니다. 버킷 내용을 반복하고 일치하는 경우 키를 확인할 수 있습니다.

그러나 그것은 더 길고 과도한 것으로 보입니다. Boto3 공식 문서에는이를 수행하는 방법이 명시 적으로 나와 있습니다.

나는 명백한 것을 놓치고 있을지도 모른다. 아무도 내가 어떻게 이것을 달성 할 수 있는지 알려 줄 수 있습니까?



답변

Boto 2의 boto.s3.key.Key객체 exists는 HEAD 요청을 수행하고 결과를 확인하여 S3에 키가 있는지 확인 하는 방법을 사용 했지만 더 이상 존재하지 않는 것 같습니다. 당신은 그것을 스스로해야합니다 :

import boto3
import botocore

s3 = boto3.resource('s3')

try:
    s3.Object('my-bucket', 'dootdoot.jpg').load()
except botocore.exceptions.ClientError as e:
    if e.response['Error']['Code'] == "404":
        # The object does not exist.
        ...
    else:
        # Something else has gone wrong.
        raise
else:
    # The object does exist.
    ...

load() 단일 키에 대한 HEAD 요청을 수행합니다. 문제의 객체가 크거나 버킷에 많은 객체가 있어도 빠릅니다.

물론 객체를 사용할 계획이므로 객체가 존재하는지 확인하고있을 수 있습니다. 이 경우에 대해 잊어 버리고 load()a get()또는 download_file()직접 수행 한 다음 오류 사례를 처리하십시오.


답변

나는 제어 흐름에 예외를 사용하는 것을 좋아하지 않습니다. 이것은 boto3에서 작동하는 대체 방법입니다.

import boto3

s3 = boto3.resource('s3')
bucket = s3.Bucket('my-bucket')
key = 'dootdoot.jpg'
objs = list(bucket.objects.filter(Prefix=key))
if any([w.key == path_s3 for w in objs]):
    print("Exists!")
else:
    print("Doesn't exist")


답변

내가 찾은 가장 쉬운 방법은 아마도 가장 효율적인 방법입니다.

import boto3
from botocore.errorfactory import ClientError

s3 = boto3.client('s3')
try:
    s3.head_object(Bucket='bucket_name', Key='file_path')
except ClientError:
    # Not found
    pass


답변

Boto3에서 폴더 (접두사) 또는 list_objects를 사용하는 파일을 확인하는 경우 응답 dict에 ‘Contents’의 존재를 객체의 존재 여부를 확인하는 데 사용할 수 있습니다. @EvilPuppetMaster가 제안한 것처럼 시도 / 제외 캐치를 피하는 또 다른 방법입니다

import boto3
client = boto3.client('s3')
results = client.list_objects(Bucket='my-bucket', Prefix='dootdoot.jpg')
return 'Contents' in results


답변

뿐만 아니라 client하지만 bucket너무 :

import boto3
import botocore
bucket = boto3.resource('s3', region_name='eu-west-1').Bucket('my-bucket')

try:
  bucket.Object('my-file').get()
except botocore.exceptions.ClientError as ex:
  if ex.response['Error']['Code'] == 'NoSuchKey':
    print('NoSuchKey')


답변

S3F 를 사용할 수 있습니다 . 이는 전형적인 파일 시스템 스타일 작업을 노출시키는 boto3 주위의 래퍼입니다.

import s3fs
s3 = s3fs.S3FileSystem()
s3.exists('myfile.txt')


답변

import boto3
client = boto3.client('s3')
s3_key = 'Your file without bucket name e.g. abc/bcd.txt'
bucket = 'your bucket name'
content = client.head_object(Bucket=bucket,Key=s3_key)
    if content.get('ResponseMetadata',None) is not None:
        print "File exists - s3://%s/%s " %(bucket,s3_key)
    else:
        print "File does not exist - s3://%s/%s " %(bucket,s3_key)