boto3 file_upload会检查文件是否存在

时间:2017-07-07 19:31:35

标签: python python-2.7 amazon-s3 boto3

我正在查看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做了这个检查。

是否有一些arg我缺少禁用“如果文件存在则自动覆盖”?

由于

编辑尝试使用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

2 个答案:

答案 0 :(得分:3)

您可以使用head_object()s3.Object().load()

来测试对象的存在
import boto3
from botocore.exceptions import ClientError

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

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

使用s3服务资源,这将实现相同的目标:

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

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

答案 1 :(得分:2)

您可以使用此代码

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")