如何使用python检查aws s3路径是否存在?



我正在尝试编写python程序,检查路径是否存在。例如,给定路径/root/subfolder1/subfolder2/,我想将此路径传递给S3 API,以检查该路径在AWS S3中是否存在。

我已经尝试过了,但它不是我需求的完整解决方案:

import boto3
import botocore
client = boto3.client('s3',aws_access_key_id=AccessKey, aws_secret_access_key=SecretAccessKey,region_name='us-east-1')
result = client.list_objects(Bucket=full_poc", Prefix="sub_folder1/sub_folder2/full" )
print(result)
exist = False
if "Contents" in result:
exist = True
print(exist)

对于这段代码,即使我传递sub而不是sub_folder1,它也会打印True

还有什么方法可以解决这个问题?

S3没有文件夹:

在Amazon S3中,桶和对象是主资源,对象存储在桶中。Amazon S3具有平面结构,而不是像在文件系统中看到的层次结构。但是,为了简化组织,Amazon S3控制台支持将文件夹概念作为分组对象的一种方式。Amazon S3通过为对象使用共享名称前缀来实现这一点(即,对象的名称以公共字符串开头)。对象名也被称为键名

/root/subfolder1/subfolder2/能够"存在"的唯一途径如果您有一个键以/root/subfolder1/subfolder2/开头的对象。列出bucket中的对象,看看是否有以该前缀开头的,例如

any((s.startswith("/root/subfolder1/subfolder2/") for s in bucket.objects.all()))

S3中没有所谓的文件夹。文件夹基本上是一个名称以'/'结尾的空文件。我们可以检查两件事

  • getObject结果为空主体
  • 确保键名以/结束在getObject之前。做这个检查的原因是,我们不想得到实际的对象,除非我们知道它是一个文件夹名,否则会导致不必要的数据传输。

如果object不存在,getObject会导致错误,我们可以直接捕获它。

s3 = boto3.client('s3')
key = 'myfolder1/subfolder/'
try:
if(key.endswith('/')):
obj = s3.get_object(Bucket='my-bucket',
Key=key)
if(len(obj.get('Body').read()) == 0):
folder = True
else:
folder = False
except Exception as e:
folder = False
if(folder):
print("yes its a folder")
else:
print("No Its not")
import os
import tensorflow as tf
os.environ['AWS_REGION'] = 'us-west-2'
os.environ['S3_ENDPOINT'] = 's3-us-west-2.amazonaws.com'
print(tf.gfile.Exists('s3path'))#返回True or False

最新更新