O boto.s3.key.Key
objeto Boto 2 costumava ter um exists
método que verificava se a chave existia no S3 fazendo uma solicitação HEAD e olhando o resultado, mas parece que isso não existe mais. Você precisa fazer isso sozinho:
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()
faz uma solicitação HEAD para uma única chave, que é rápida, mesmo se o objeto em questão for grande ou você tiver muitos objetos em seu bucket.
Obviamente, você pode verificar se o objeto existe porque planeja usá-lo. Se for esse o caso, você pode simplesmente esquecer oe load()
fazer um get()
ou download_file()
diretamente, e então lidar com o caso de erro.
boto3
, parece que o melhor que você pode fazer no momento é ligarhead_object
para tentar buscar os metadados da chave e manipular o erro resultante, se ele não existir.exists
booleano acabe, e é mais claro (espero!) Que as pessoas devam adaptar isso à sua situação.e.response['Error']['Code']
ter um valor como"NoSuchKey"
, não"404"
. Não verifiquei se isso se deve a uma diferença nas versões da biblioteca ou a uma alteração na própria API desde que esta resposta foi escrita. De qualquer maneira, na minha versão do boto3, uma abordagem mais curta do que a verificaçãoe.response['Error']['Code']
é capturar apenass3.meta.client.exceptions.NoSuchKey
em primeiro lugar.client
(em oposição aresource
), faça-o ems3.head_object(Bucket='my_bucket', Key='my_key')
vez des3.Object(...).load()
Não sou muito fã de usar exceções para controlar o fluxo. Esta é uma abordagem alternativa que funciona no boto3:
fonte
A maneira mais fácil que encontrei (e provavelmente a mais eficiente) é esta:
fonte
s3 = boto3.client('s3')
if e.response['ResponseMetadata']['HTTPStatusCode'] == 404:
No Boto3, se você estiver procurando por uma pasta (prefixo) ou um arquivo usando list_objects. Você pode usar a existência de 'Conteúdo' no ditado de resposta como uma verificação para verificar se o objeto existe. É outra maneira de evitar a tentativa / exceto capturas, como sugere @EvilPuppetMaster
fonte
s3:GetObject
permissões, apenas ass3:ListBucket
permissõesNão apenas
client
masbucket
também:fonte
bucket.Object(key).last_modified
.Você pode usar S3Fs , que é essencialmente um invólucro do boto3 que expõe operações típicas do estilo do sistema de arquivos:
fonte
fonte
FWIW, aqui estão as funções muito simples que estou usando
fonte
Supondo que você queira apenas verificar se existe uma chave (em vez de sobrescrevê-la), faça essa verificação primeiro:
fonte
Isso pode verificar o prefixo e a chave e buscar no máximo 1 chave.
fonte
Experimente este simples
fonte
Se você tiver menos de 1000 em um diretório ou bloco, poderá configurá-los e depois verificar se essa chave neste conjunto:
Esse código funciona mesmo se
my/dir
não existir.http://boto3.readthedocs.io/en/latest/reference/services/s3.html#S3.Client.list_objects_v2
fonte
fonte
Para boto3, o ObjectSummary pode ser usado para verificar se existe um objeto.
Em ObjectSummary.load
Isso mostra que você pode usar em
ObjectSummary
vez deObject
se planeja não usarget()
. Aload()
função não recupera o objeto, apenas obtém o resumo.fonte
Aqui está uma solução que funciona para mim. Uma ressalva é que eu sei o formato exato da chave antes do tempo, portanto, estou listando apenas o único arquivo
fonte
você pode usar o Boto3 para isso.
Aqui, a chave é o caminho que você deseja verificar se existe ou não
fonte
%timeit
teste esta parece ser a opção mais rápidaÉ realmente simples com o
get()
métodofonte
Existe uma maneira simples de verificar se o arquivo existe ou não no bucket do S3. Não precisamos usar exceção para isso
fonte
object_name
existir no intervalo. Por exemplomy_file.txt.oldversion
, retornará um falso positivo se você verificarmy_file.txt
. Um pouco de argumento para a maioria, mas para algo tão amplo quanto "existe o arquivo" que você provavelmente usará em todo o aplicativo, provavelmente vale a pena levar em consideração.Se você procurar uma chave equivalente a um diretório, poderá querer essa abordagem
Isso funciona para uma chave pai ou uma chave que equivale a arquivo ou uma chave que não existe. Tentei a abordagem preferida acima e falhei nas chaves dos pais.
fonte
Notei que apenas para capturar a exceção usando
botocore.exceptions.ClientError
precisamos instalar o botocore. O botocore ocupa 36M de espaço em disco. Isso é particularmente impactante se usarmos as funções aws lambda. Em vez disso, se usarmos exceção, podemos pular usando a biblioteca extra!O código fica assim. Por favor, compartilhe seus pensamentos:
fonte
Apenas seguindo o thread, alguém pode concluir qual é a maneira mais eficiente de verificar se existe um objeto no S3?
Eu acho que o head_object pode ganhar, pois apenas verifica os metadados que são mais leves que o próprio objeto real
fonte
Em https://www.peterbe.com/plog/fastest-way-to-find-out-if-a-file-exists-in-s3, este é apontado como o método mais rápido:
fonte
Verificação de saída
de Boto S3 Docs
Você pode simplesmente chamar bucket.get_key (keyname) e verificar se o objeto retornado é None.
fonte