【问题标题】:Google Storage // Cloud Function // Python Modify CSV file in the BucketGoogle Storage // Cloud Function // Python 修改 Bucket 中的 CSV 文件
【发布时间】:2021-08-25 07:12:30
【问题描述】:

感谢阅读。

我在触摸 Bucket 中的 csv 文件时遇到了一些问题,我知道如何复制/重命名/移动文件,但我不知道如何在不下载到本地机器的情况下修改文件。

实际上我有一个主要的想法,它以字节的形式下载 blob(csv 文件),然后以字节的形式修改并上传到存储桶。但我不明白如何修改字节。

我应该如何接触 csv:添加新的标题 - 日期,并在 csv 的每一行中添加值(today.date)

---输入--- 存储桶中的 CSV 文件:

a b
1 2

--输出-- 已更新存储桶中的 CSV 文件:

a b date
1 2 today

我的代码:

def addDataToCsv(bucket,fileName):
    today = str(date.today())

    bucket = storage_client.get_bucket(bucket)
    blob = bucket.blob(fileName)
    fileNameText = blob.download_as_string()
    
    /// This should be a magic bytes modification //

    blobNew = bucket.blob(path+'/'+'mod.csv')
    blobNew.upload_from_string(fileNameText,content_type='text/csv')


请帮忙,感谢您的时间和精力

【问题讨论】:

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


    【解决方案1】:

    如果我理解,您想修改存储桶中的 CSV 文件而不将其下载到本地机器文件系统。

    cannot directly edit 来自云存储桶的文件,除了元数据之外,因此您需要以某种方式将其下载到本地计算机并将更改推送到桶。

    对象是不可变的,这意味着上传的对象在其整个存储生命周期内都无法更改。

    不过,一种方法是使用 Cloud Storage FUSE,它将 Cloud Storage 存储分区挂载为文件系统,以便您可以从那里编辑任何文件并将更改应用到您的存储分区。

    如果这对您来说不是一个合适的解决方案,您可以通过解码字节对象(通常使用 UTF-8,尽管取决于您的字符)并在上传之前重新编码来下载和修改字节。

    # Create an array of every CSV file line
    csv_array = fileNameText.decode("utf-8").split("\n")
    # Add header
    csv_array[0] = csv_array[0] + ",date\n"
    # Add the date to each field
    for i in range(1,len(csv_array)):
        csv_array[i] = csv_array[i] + "," + today + "\n"
    # Reencode from list to bytes to upload
    fileNameText = ''.join(csv_array).encode("utf-8")
    

    考虑到,如果您的本地计算机有一些严重的存储或性能限制,如果您的 CSV 足够大,可能会导致像上面那样处理它的问题,或者仅供参考,您可以使用compose command。为此,您需要修改上面的代码,以便每次只编辑 CSV 文件的某些部分、上传,然后将 gsutil compose 加入 Cloud Storage。

    【讨论】:

      【解决方案2】:

      抱歉,我知道我不适合你,但如果我是你,我会尽量保持简单。事实上,如果大多数系统保持简单并且更易于维护和共享(KISS 原则),则它们的效果最好。因此,鉴于您使用的是本地计算机,我假设您有足够的网络带宽以及足够的磁盘空间和内存。所以我会毫不犹豫地下载文件,修改它,然后重新上传。即使在处理大文件时。

      那么,如果您愿意使用其他格式的文件:

      以字节形式下载 blob(csv 文件)

      在这种情况下,对于大小和简单代码而言,更好的解决方案是使用/将文件转换为 Parquet 或 Avro 格式。这些格式将大大减少您的文件大小,特别是如果您添加压缩。然后它们允许您为数据保留结构,这使得它们的修改方式更简单。最后,您在网上有很多关于如何在 python 中使用这些格式的资源,以及 CSV、Avro 和 Parquet 之间的比较。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-08
        • 2020-06-13
        • 1970-01-01
        • 2019-02-14
        • 2021-06-16
        • 2014-11-14
        • 1970-01-01
        • 2020-05-05
        相关资源
        最近更新 更多