有没有办法让 ListObjectsV2 验证 s3 对象 type/extension?

Is there a way to make ListObjectsV2 to validate s3 object type/extension?

我正在使用 python3 中的 ListObjectsV2 检查 s3 位置是否存在。

我有一个用例需要验证 s3 对象的文件类型或扩展名。

import boto3
s3 = boto3.client("s3")
bucket="bucketName"
key="folder1/folder2/myObject.csv"
res = s3.list_objects_v2(Bucket=bucket, Prefix=key)
print(res)
print(res.get("KeyCount"))
if res.get("KeyCount") > 0: print("s3 object exists")
else: print("s3 object does not exists")

示例对象如下: s3://bucketName/folder1/folder2/myObject.csv

以下这些场景给出了输出:

  1. s3://bucketName/folder1/folder2/myObject.csv 给出“s3 对象存在”
  2. s3://bucketName/folder1/folder2/myObject.c 给出“s3 对象存在”
  3. s3://bucketName/folder1/folder2/myObject。给出“s3 对象存在”
  4. s3://bucketName/folder1/folder2/myObject.x 给出“s3 对象不存在”

我观察到部分扩展也在验证中。

我也想要 2,3,因为“s3 对象不存在”。我可能有很多扩展,所以不能使用“结束于”。 也许我可以尝试使用在“。”之后划分 s3path 的解析器。用于扩展和使用以结束。但我正在寻找更简单的方法。

提前致谢。

ListObject "限制对以指定前缀开头的键的响应。"这正是您所看到的,因为“folder1/folder2/myObject.csv”以“folder1/folder2/myObject”开头。“

如果你想查看一个对象是否存在,你需要一个对特定对象进行操作的API。一种这样的选择是调用 HeadObject 并查看它是否因无效密钥而失败:

import botocore.exceptions

def does_key_exist(s3, bucket, key):
    try:
        # Try to head the object
        s3.head_object(Bucket=bucket, Key=key)
        # All good
        return True
    except botocore.exceptions.ClientError as e:
        # See if the failure is because the object doesn't exist
        code = e.response['Error']['Code']
        if code == "NoSuchKey" or code == "404":
            return False
        else:
            # Some other error, let the caller handle it if they want
            raise