使用python在谷歌存储中的存储桶内创建一个新存储桶

时间:2021-07-10 08:23:04

标签: python python-3.x google-cloud-platform

我需要使用 python 在 google clous 存储中的文件夹内创建一个文件夹。 我知道如何创建一个文件夹:

bucket_name = 'data_bucket_10_07'

# create a new bucket
bucket = storage_client.bucket(bucket_name)
bucket.storage_class = 'COLDLINE' # Archive | Nearline | Standard
bucket.location = 'US' # Taiwan
bucket = storage_client.create_bucket(bucket) # returns Bucket object


my_bucket = storage_client.get_bucket(bucket_name)

当我尝试将 bucket_name = 'data_bucket_10_07' 更改为 bucket_name = 'data_bucket_10_07/data_bucket_10_07_1' 时出现错误:

google.api_core.exceptions.BadRequest: 400 POST https://storage.googleapis.com/storage/v1/b?project=effective-forge-317205&prettyPrint=false: Invalid bucket name: 'data_bucket_10_07/data_bucket_10_07_1'

我应该如何解决我的问题?

2 个答案:

答案 0 :(得分:1)

正如约翰在评论中提到的,在一个桶里放一个桶在本体论上可能是不可能的。

有关文档的详细信息,请参阅 Bucket naming guidelines

简而言之:

一个全局命名空间中只有一层bucket(因此bucket名称是全局唯一的)。存储桶名称以外的所有内容 - 属于对象名称。

例如,您可以创建一个存储桶(假设名称尚未使用),例如 data_bucket_10_07。在这种情况下,它可能看起来像 gs://data_bucket_10_07

然后,您可能希望以这种方式存储一些对象(文件),使其看起来像一个目录层次结构,因此,假设有 /01/data.csv 对象和 /02/data.csv 对象。 0102 大概应该在语义上反映某个日期。

那些 /01//02/ 元素 - 本质上是对象名称的开始部分(或者换句话说就是对象的前缀)。

到目前为止,存储桶名称是 gs://data_bucket_10_07

对象名称为 /01/data.csv/02/data.csv

我建议查看 Object naming guidelines 文档,其中对这些想法的描述要好得多,我可以用一句话来描述。

答案 1 :(得分:0)

其他评论在详细说明嵌套存储桶是不可能的方面做得很好,但他们只是在短时间内提出以下建议:GCS 不依赖文件夹,仅在 Web UI 上呈现具有层次结构的内容以方便使用.

来自documentation

<块引用>

Cloud Storage 使用平面命名空间,这意味着文件夹实际上并不存在于 Cloud Storage 中。如果您在存储桶 your-bucket 中创建名为 folder1/file.txt 的对象,则该对象的路径为 your-bucket/folder1/file.txt。没有 folder1 文件夹,只有一个名称中包含 folder1 的对象。

因此,如果您想为组织创建一个“文件夹”并立即将一个对象放入其中,请在名称前使用“文件夹”命名您的对象,如果它们出现,GCS 将负责“创建”它们不存在。