我有一个带有以下树的Google存储桶(请注意名为“ /”的文件夹!):
"bucket-1"
|
|--- "data.csv"
|
|--- "/"
|
|--- "runs"
|
|--- "run-1"
| |
| |--- "data.csv"
|
|--- "run-2"
|
|--- "data.csv"
我想使用子文件夹“ /”中的Python库libcloud访问对象(.csv文件)。
我可以访问“ /”文件夹之外的data.csv
:
>>> client.get_object(container_name='bucket-1', object_name='/data.csv')
<Object: name=/data.csv, size=181580, hash=8252d90d95b7b1cb7b4e699b90fbcce3, provider=Google Cloud Storage ...>
使用带有两个斜杠的gsutil,我可以在“ /”中看到对象:
>>> gsutil ls "gs://bucket-1//runs/run-1"
gs://bucket-1//runs/run-1/data.csv
如果我使用client.get_object(container_name='bucket-1', object_name='//runs/run-1/data.csv')
或client.get_object(container_name='bucket-1', object_name='/runs/run-1/data.csv')
使用libcloud,则会收到错误消息:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/andrey/miniconda3/envs/mostly-cloud/lib/python3.6/site-packages/libcloud/storage/drivers/s3.py", line 342, in get_object
object_name=object_name)
libcloud.storage.types.ObjectDoesNotExistError: <ObjectDoesNotExistError in <libcloud.storage.drivers.google_storage.GoogleStorageDriver object at 0x7f40560cd4e0>, value=None, object = //runs/run-1/data.csv>
另一方面,
client.list_container_objects(client.get_container("bucket-1"))
[<Object: name=/runs/run-1/data.csv, size=357683, hash=..., provider=Google Cloud Storage ...>, <Object: name=/runs/run-2/data.csv, size=357683, hash=..., provider=Google Cloud Storage ...>]
那么,如何获取位于“ /”目录中的对象?
答案 0 :(得分:1)
为了测试此行为,我复制了您的方案。我能够通过以下方式创建此层次结构:
RuntimeHelpers.PrepareMethod
这是一个奇怪的行为,不应允许。
如果您尝试从GCP控制台使用该名称创建文件夹,则会看到以下消息:
文件夹名称中不允许正斜杠(/)。
因此,我创建了一个Public Issue Tracker,您可以在其中获得有关此问题的反馈。
关于文件夹的命名,您可以查看Google关于subdirectories工作方式的文档。
总而言之,不应允许您使用此名称创建文件夹。现在最好的做法是避免使用类似这样的名称,而希望使用可以处理的字符串名称。