如何借助python检查aws s3路径是否存在?

如何借助python检查aws s3路径是否存在?,python,amazon-web-services,amazon-s3,boto3,Python,Amazon Web Services,Amazon S3,Boto3,我正在尝试编写python程序来检查路径是否存在。例如,给定路径/root/subfolder1/subfolder2/,我想将此路径传递给S3API,以检查AWS S3中是否存在此路径 我已经尝试过这一点,但它不是满足我要求的全面解决方案: import boto3 import botocore client = boto3.client('s3',aws_access_key_id=AccessKey, aws_secret_access_key=SecretAccessKey,regio

我正在尝试编写python程序来检查路径是否存在。例如,给定路径
/root/subfolder1/subfolder2/
,我想将此路径传递给S3API,以检查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\u folder1
它也会打印
True

解决此问题的其他方法有哪些?

在AmazonS3中,bucket和对象是主要资源,对象存储在bucket中。AmazonS3具有扁平结构,而不是像文件系统中那样的层次结构。然而,为了组织的简单性,AmazonS3控制台支持文件夹概念作为对象分组的一种方式。AmazonS3通过使用对象的共享名称前缀来实现这一点(即,对象的名称以公共字符串开头)。对象名称也称为键名称

/root/subfolder1/subfolder2/
可以“存在”的唯一方法是,如果您有一个对象,其键以
/root/subfolder1/subfolder2/
开头。并查看是否有以该前缀开头的,例如

any((s.startswith(“/root/subfolder1/subfolder2/”)用于bucket.objects.all()中的s)

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

  • getObject导致正文为空
  • 确保键的名称在getObject之前以
    /
    结尾。进行此检查的原因是,我们不希望获取实际对象,除非我们知道它是文件夹名称,否则将导致不必要的数据传输
若对象不存在,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")

您所说的“即使我通过
sub
而不是
sub\u folder1
它也会打印
True
”是什么意思?你能举个完整的例子吗?此外,您在该代码中存在引用问题。我猜您想做
客户端。列出对象(Bucket=“full\u poc”…
?为什么要检查路径是否存在?您可以将对象存储在S3中的任何路径中,而无需创建文件夹。@Tg。这是问题的答案,即使答案不正确。请不要在低质量帖子队列中删除它。
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