如何将数据附加到谷歌云存储上的文件

Posted

技术标签:

【中文标题】如何将数据附加到谷歌云存储上的文件【英文标题】:How can I append data to a file on google cloud storage 【发布时间】:2020-03-15 18:33:29 【问题描述】:

我正在使用谷歌云功能在谷歌云存储上创建一个 CSV 文件。现在我想编辑该文件 - 是否可以在该文件中附加数据?如果是,那么如何?

【问题讨论】:

看看这些是否有帮助...***.com/questions/53487432/…和***.com/questions/52715217/… 感谢您的回复。但它不适用于大文件 哪种建议的解决方法不适用于大文件? 这能回答你的问题吗? How to append write to google cloud storage file from app engine? 【参考方案1】:

Google Cloud Storage 是 Google Cloud Platform 的对象存储托管服务。 与块存储或文件系统存储不同,存储的对象是不可变的。

如official doc 中所述:

对象是不可变的,这意味着上传的对象不能 在整个存储生命周期内发生变化。对象的存储寿命 是成功创建(上传)对象和成功之间的时间 对象删除。在实践中,这意味着你不能使 对对象的增量更改,例如追加操作或截断 操作。但是,可以覆盖对象 存储在 Cloud Storage 中,并以原子方式进行 - 直到 新上传完成旧版本的对象将被提供给 读者,并在上传完成后新版本的对象 将提供给读者。所以一个简单的覆盖操作 标志着一个不可变对象生命周期的结束和 一个新的不可变对象的生命周期。

作为一种解决方法,我们可以考虑将多个文件上传到一个存储桶,然后create a new object by composing所有之前的文件。

gsutil compose gs://bucket/obj1 [gs://bucket/obj2 ...] gs://bucket/composite

请注意,此compose 命令也可通过JSON API 获得:

POST https://storage.googleapis.com/storage/v1/b/bucket/o/destinationObject/compose

通过Cloud Storage Client Libraries

所以这个调用可以很容易地集成到您的代码中。请务必在需要之前授予访问存储桶的角色。

Check official documentation

【讨论】:

【参考方案2】:

我正在使用这个 python 脚本将数据附加到 csv 文件中。此脚本将下载文件、附加数据并再次上传到您存储桶中的同一文件。您可以在 Cloud Function 中轻松实现此功能。

import csv
from google.cloud import storage

client = storage.Client()
bucket = client.get_bucket('thehotbucket')
blob = bucket.get_blob('data1.csv')
blob.download_to_filename('data1.csv')
fields = ['first', 'second', 'third']
with open(r'data1.csv', 'a') as f:
    writer = csv.writer(f)
    writer.writerow(fields)

blob = bucket.blob("data1.csv")
blob.upload_from_filename("data1.csv")

如果你只想合并文件,你可以使用 gsutil 命令

gsutil compose gs://bucket/obj1 [gs://bucket/obj2 ...] gs://bucket/obj1

【讨论】:

如果文件很大,第一个解决方案会花费太多时间,请您详细介绍一下 gsutil 命令 如documentation中所述“compose 命令创建一个新对象,其内容是同一桶下给定源对象序列的串联”。您可以在 Cloud Shell 中运行此命令,指定要附加的所需文档,它将将此文档附加到一个新文档中 请注意,这个 compose 命令也可以通过 Json Api 或 Cloud 库获得,请参阅我的回答 @Chris32 blob.download_to_filename('data1.csv') 以“wb”模式下载并打开文件,因此这会导致我的 GCP 函数内部出错。 你为什么使用'wb'模式而不是'a'?【参考方案3】:

GCS 是一个对象存储,一旦推送到 GCS 存储桶,就不允许更新/编辑文件。

更新位于 GCS 存储桶中的文件的唯一方法是下载文件 --> 进行必要的更改,然后将其推送回 GCS 存储桶。这将用新内容覆盖文件。

【讨论】:

以上是关于如何将数据附加到谷歌云存储上的文件的主要内容,如果未能解决你的问题,请参考以下文章

使用 SSIS 将本地文件上传到谷歌云存储桶

如何使用签名的 URL 将文件上传到谷歌云存储桶

将文件从 AWS s3 (SSE) 存储桶复制到谷歌云

从谷歌云数据存储迁移到谷歌云 sql

将ffmpeg中的视频文件直接输出到谷歌云存储

将缓冲区上传到谷歌云存储