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

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

【问题讨论】:

标签: csv google-cloud-platform google-cloud-functions google-cloud-storage


【解决方案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 存储桶。这将用新内容覆盖文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-19
      • 2017-02-10
      • 2015-02-28
      • 1970-01-01
      相关资源
      最近更新 更多