boto.s3.key.Key
Objek Boto 2 dulu memiliki exists
metode yang memeriksa jika kunci ada pada S3 dengan melakukan permintaan HEAD dan melihat hasilnya, tetapi tampaknya tidak ada lagi. Anda harus melakukannya sendiri:
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()
apakah permintaan HEAD untuk satu kunci, yang cepat, bahkan jika objek tersebut besar atau Anda memiliki banyak objek di ember Anda.
Tentu saja, Anda mungkin memeriksa apakah objek itu ada karena Anda berencana menggunakannya. Jika demikian, Anda bisa melupakan load()
dan melakukan get()
atau download_file()
langsung, kemudian menangani kasing kesalahan di sana.
boto3
, sepertinya yang terbaik yang dapat Anda lakukan saat ini adalah meneleponhead_object
untuk mencoba dan mengambil metadata untuk kunci tersebut, lalu menangani kesalahan yang dihasilkan jika tidak ada.exists
boolean hilang, dan lebih jelas (saya harap!) Bahwa orang-orang seharusnya menyesuaikan ini dengan situasi mereka.e.response['Error']['Code']
memiliki nilai suka"NoSuchKey"
, tidak"404"
. Saya belum memeriksa apakah ini karena perbedaan dalam versi pustaka atau perubahan dalam API itu sendiri sejak jawaban ini ditulis. Either way, dalam versi boto3 saya, pendekatan yang lebih pendek daripada memeriksae.response['Error']['Code']
adalah untuk menangkap hanyas3.meta.client.exceptions.NoSuchKey
di tempat pertama.client
(sebagai lawan dari aresource
) maka lakukans3.head_object(Bucket='my_bucket', Key='my_key')
alih - alihs3.Object(...).load()
Saya bukan penggemar menggunakan pengecualian untuk aliran kontrol. Ini adalah pendekatan alternatif yang bekerja di boto3:
sumber
Cara termudah yang saya temukan (dan mungkin yang paling efisien) adalah ini:
sumber
s3 = boto3.client('s3')
if e.response['ResponseMetadata']['HTTPStatusCode'] == 404:
Di Boto3, jika Anda memeriksa folder (awalan) atau file menggunakan list_objects. Anda dapat menggunakan keberadaan 'Konten' di dict tanggapan sebagai cek untuk apakah objek itu ada. Ini cara lain untuk menghindari try / kecuali tangkapan seperti yang disarankan @EvilPuppetMaster
sumber
s3:GetObject
izin hanyas3:ListBucket
izinTidak hanya
client
tetapibucket
juga:sumber
bucket.Object(key).last_modified
.Anda dapat menggunakan S3F , yang pada dasarnya adalah pembungkus di sekitar boto3 yang memaparkan operasi gaya sistem file yang khas:
sumber
sumber
FWIW, berikut adalah fungsi yang sangat sederhana yang saya gunakan
sumber
Dengan asumsi Anda hanya ingin memeriksa apakah ada kunci (alih-alih menulisnya dengan pelan), lakukan ini terlebih dahulu:
sumber
Ini bisa memeriksa awalan dan kunci, dan mengambil paling banyak 1 kunci.
sumber
Coba ini sederhana
sumber
Jika Anda memiliki kurang dari 1000 dalam direktori atau ember Anda bisa mendapatkan mereka dan setelah memeriksa apakah kunci tersebut dalam set ini:
Kode seperti itu berfungsi bahkan jika
my/dir
tidak ada.http://boto3.readthedocs.io/en/latest/reference/services/s3.html#S3.Client.list_objects_v2
sumber
sumber
Untuk boto3, ObjectSummary dapat digunakan untuk memeriksa apakah suatu objek ada.
Di ObjectSummary.load
Ini menunjukkan bahwa Anda dapat menggunakan
ObjectSummary
daripadaObject
jika Anda berencana untuk tidak menggunakanget()
. Theload()
fungsi tidak mengambil objek hanya memperoleh ringkasan.sumber
Ini solusi yang cocok untuk saya. Satu peringatan adalah bahwa saya tahu format yang tepat dari kunci sebelumnya, jadi saya hanya mendaftar satu file
sumber
Anda dapat menggunakan Boto3 untuk ini.
Di sini kuncinya adalah jalur yang ingin Anda periksa ada atau tidak
sumber
%timeit
tes sederhana ini sepertinya pilihan tercepatSangat sederhana dengan
get()
metodesumber
Ada satu cara sederhana yang dengannya kita dapat memeriksa apakah file ada atau tidak di bucket S3. Kami tidak perlu menggunakan pengecualian untuk ini
sumber
object_name
ada di ember. Misalnyamy_file.txt.oldversion
akan mengembalikan positif palsu jika Anda memeriksamy_file.txt
. Sedikit kasus tepi untuk sebagian besar, tetapi untuk sesuatu seluas "apakah ada file" yang mungkin Anda gunakan di seluruh aplikasi Anda mungkin layak dipertimbangkan.Jika Anda mencari kunci yang setara dengan direktori maka Anda mungkin menginginkan pendekatan ini
Ini berfungsi untuk kunci induk atau kunci yang sama dengan file atau kunci yang tidak ada. Saya mencoba pendekatan yang disukai di atas dan gagal pada kunci induk.
sumber
Saya perhatikan bahwa hanya untuk menangkap pengecualian menggunakan
botocore.exceptions.ClientError
kita perlu menginstal botocore. botocore membutuhkan 36M ruang disk. Ini sangat berdampak jika kita menggunakan fungsi aws lambda. Di tempat itu jika kita hanya menggunakan pengecualian maka kita bisa melewatkan menggunakan perpustakaan tambahan!Kode terlihat seperti ini. Silakan bagikan pemikiran Anda:
sumber
Cukup mengikuti utas, dapatkah seseorang menyimpulkan mana yang merupakan cara paling efisien untuk memeriksa apakah suatu objek ada di S3?
Saya pikir head_object mungkin menang karena hanya memeriksa metadata yang lebih ringan dari objek itu sendiri
sumber
Dari https://www.peterbe.com/plog/fastest-way-to-find-out-if-a-file-exists-in-s3 ini ditunjukkan sebagai metode tercepat:
sumber
Periksa
dari Boto S3 Docs
Anda bisa memanggil bucket.get_key (keyname) dan memeriksa apakah objek yang dikembalikan adalah None.
sumber