如何在python中检查AWS S3中是否已经存在bucket

2024-04-26 23:36:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我的桶结构如下所示:

root/subfolder1/subfolder2/file1.txt

根据上述结构,可能有三种情况:

  1. 根目录不存在
  2. 根目录存在,但子文件夹1不存在
  3. 根目录和子文件夹1都存在,但子文件夹2不存在

我必须用python编写程序,并且需要一些基于标志的方法,如果bucket不存在,标志应该从true变为false,反之亦然。 python中是否有一些API来检查python中的所有上述场景


Tags: 方法txt文件夹truebucket标志情况root
3条回答

使用boto3

    folder_name = 'folder_name'
    s3_resource = boto3.resource("s3")
    bucket = s3_resource.Bucket(
        settings.BUCKET
    )

    # Get file contents when the bucket is exists
    if bucket:
        objects = bucket.objects.filter(
            Prefix=f"{folder_name}/"
        )

        for obj in objects:
            # Get file contents
            response = obj.get()
            lines = response[u"Body"].read().decode("utf-8").split("\n")

            # Handle code here
            ...
    else:
        print(f"Bucket {settings.BUCKET} does not exist!")
        return

AmazonS3中不存在文件夹。您可以在任何路径中创建一个对象,它将起作用

AmazonS3管理控制台将使文件夹像普通文件夹一样“显示”,但它们实际上并不存在。例如,删除对象将使文件夹“消失”(因为它们实际上从未存在)

控制台中的创建文件夹按钮实际上创建了一个长度为零的对象,其键(文件名)等于文件夹的完整路径。删除零长度对象将使文件夹消失(但仅当文件夹为空时)

底线:不要关心文件夹是否存在。只需在需要的地方创建对象

在S3中,bucket在您的示例中仅为root。没有文件夹的概念,而是将每个文件存储在“link/key/path”下(您可以将其视为一个长文件名,其中包含“/”

知道这一切你需要知道你的桶存在或不存在。之后,您可以使用特定密钥编写文件。不需要检查路径的一部分是否存在。如果您想避免文件重写,那么可以使用head方法来检查它,请参见下文

要安全创建存储桶,请执行以下操作:

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#S3.Client.create_bucket

try:
  client.create_bucket(
    Bucket='root',
    CreateBucketConfiguration={
        'LocationConstraint': 'us-east-1',
    },
  )
except: # you can catch the specific error that boto3 throws when it already exists, I just don't remember what is this error.
  pass

要检查文件是否存在,请执行以下操作:

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#S3.Client.head_object

  try:
    client.head_object(
      Bucket="root",
      Key="/path/to/file/data.json"
    )
    return True
  except:
    return False
``

相关问题 更多 >