如何在 tensorflow 模型中使用 python 访问 google 云存储桶中最新上传的对象

How to access the latest uploaded object in google cloud storage bucket using python in tensorflow model

我正在研究 tensorflow 模型,我想在其中使用最新的 ulpoad 对象,以便从上传的对象中获取输出。有没有办法使用 python.

访问上传到 Google 云存储桶的最新对象

没有直接的方法从 Google 云存储中获取最新上传的对象。但是,有一个使用对象元数据的解决方法。

上传到 Google 云存储的每个对象都有不同的元数据。有关详细信息,您可以访问 Cloud Storage > Object Metadata 文档。元数据之一是“上次更新”。该值是上次更新对象的时间戳。这只会发生在 3 种情况下:

A) 对象是第一次上传。

B) 对象已上传并被替换,因为它已经存在。

C) 对象的元数据已更改。

如果您不更新对象的元数据,则可以使用以下解决方法:

  1. 使用非常旧的 date_time 对象 (1900-01-01 00:00:00.000000) 设置一个变量。对象不可能有此更新元数据。
  2. 设置一个变量来存储最新的 blob 名称并将其设置为 "NONE"
  3. 列出存储桶中的所有 blob Google Cloud Storage Documentation
  4. 对于每个 blob 名称 load the updated metadata 并将其转换为 date_time 对象
  5. 如果 blob 的更新元数据大于您已有的元数据,则更新它并保存当前名称。
  6. 此过程将继续,直到您搜索所有 blob,并且只有最新的一个会保存在变量中。

我自己编写了一些代码,这 my GitHub code example 对我有用。获取逻辑并根据您的需要对其进行修改。我还建议在本地测试它,然后在您的代码中使用它。

但是,如果您手动更新 blob 的元数据,那么这是另一个解决方法:

如果您更新 blob 的任何元数据,请参阅此文档 Viewing and Editing Object Metadata,然后该 blob 的 "Last update" 时间戳也会更新,因此 运行 上述方法 不会给你最后上传的对象,但最后修改的是不同的。因此,您可以在每次上传时向对象添加自定义元数据,并且该自定义元数据将是您上传对象时的时间戳。因此,无论以后元数据发生什么变化,自定义元数据将始终保持对象上传的时间。然后使用与上述相同的方法,但不是获取 blob.update,而是获取 blob.metadata,然后使用与上述相同的逻辑使用该日期。

补充说明:

要使用自定义元数据,您需要使用前缀 x-goog-meta-,如查看和编辑对象元数据文档的 Editing object metadata 部分所述。

所以 [CUSTOM_METADATA_KEY] 应该是 x-goog-meta-uploaded[CUSTOM_METADATA_VALUE] 应该是 [CURRENT_TIMESTAMP_DURING_UPLOAD]

下面是我用来抓取最新更新对象的。

实例化您的客户端

from google.cloud import storage
# first establish your client
storage_client = storage.Client()

通过 prefix

定义 bucket_name 和任何其他路径
# get your blobs
bucket_name = 'your-glorious-bucket-name'
prefix = 'special-directory/within/your/bucket' # optional

迭代客户端返回的blobs

将这些存储为元组记录既快速又高效。

blobs = [(blob, blob.updated) for blob in storage_client.list_blobs(
    bucket_name,
    prefix = prefix,
)]

根据第二个元组值对列表进行排序

# sort and grab the latest value, based on the updated key
latest = sorted(blobs, key=lambda tup: tup[1])[-1][0]
string_data = latest.download_as_string()

Metadata key docs and Google Cloud Storage Python client docs.

One-liner

# assumes storage_client as above
# latest is a string formatted response of the blob's data
latest = sorted([(blob, blob.updated) for blob in storage_client.list_blobs(bucket_name, prefix=prefix)], key=lambda tup: tup[1])[-1][0].download_as_string()