Boto3文件上传会检查文件是否存在吗?

12

我在查看 boto3 文档时没有找到是否原生支持检查 S3 中的文件是否已存在,如果不存在则不尝试重新上传的功能。

这是我已经实现的内容:

import boto3

s3_client = boto3.client('s3')
s3_bucket = 'bucketName'
s3_folder = 'folder1234/'
temp_log_dir = "tempLogs/"


s3_client.upload_file(temp_log_dir + file_name, s3_bucket, s3_folder + file_name)

我注意到的是,如果文件已经存在于S3中,则来自boto3的.upload_file()仍会传输该文件。我通过查看iftop进行了此检查。

是否有一些参数我错过了以禁用“自动覆盖文件”?

谢谢

编辑尝试head方法

s3 = boto3.resource('s3')
file_name = 'somelogfile.gz'

try:
    s3.Object(s3_bucket+ s3_folder+s3_filename).load()
    print 'success'
except botocore.exceptions.ClientError as e:
    print e

你没有错过任何东西,你需要显式地检查这个键是否存在,例如s3_client.head_object('<bucket>', '<keyname>'),它只获取元数据,所以应该相对较轻。 - AChampion
所以我会先将^放入if / else中,如果它返回一个布尔值(我猜是这样),那么就继续下载。keyname = filename吗?谢谢。 - chowpay
你需要将它放在一个 try: except: 块中,因为如果不存在它会抛出一个 ClientError - AChampion
我会编辑这个问题。我尝试过了,但是出现了这个错误:"%s()只接受关键字参数。" % py_operation_name) - chowpay
据我所知,您无法获得200成功代码,因为botocore模块会处理它。你只能得到错误代码。 - AChampion
显示剩余3条评论
2个回答

27
您可以使用 s3_client.head_object()s3_service.Object().load() 来测试对象是否存在:
import boto3
from botocore.exceptions import ClientError

def check(s3_client, bucket, key):
    try:
        s3_client.head_object(Bucket=bucket, Key=key)
    except ClientError as e:
        return int(e.response['Error']['Code']) != 404
    return True

s3_client = boto3.client('s3')
print(check(s3_client, <bucket>, <key>))

使用s3服务资源可以实现相同的功能:

def check(s3_service, bucket, key):
    try:
        s3_service.Object(bucket, key).load()
    except ClientError as e:
        return int(e.response['Error']['Code']) != 404
    return True

s3_service = boto3.resource(service_name='s3')
print(check(s3_service, <bucket>, <key>))

这可能是处理这个问题的最佳方式,但需要注意如果存在其他上传者,则会出现竞争条件。 - dornadigital

8
您可以使用此代码。
import boto3

s3 = boto3.resource('s3')
bucket = s3.Bucket('my-bucket')
key = 'dootdoot.jpg'
objs = list(bucket.objects.filter(Prefix=key))
if len(objs) > 0 and objs[0].key == key:
 print("Exists!")
else:
 print("Doesn't exist")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接