Google 存储 // 云函数 // Python 修改存储桶中的 CSV 文件
Google Storage // Cloud Function // Python Modify CSV file in the Bucket
感谢阅读。
我在处理 Bucket 中的 csv 文件时遇到一些问题,我知道如何 copy/rename/move 文件,但我不知道如何在不下载到本地计算机的情况下修改文件。
实际上我有一个主要想法,它以字节形式下载 blob(csv 文件),然后修改并以字节形式上传到 Bucket。但是我不明白如何修改字节。
我应该如何接触 csv:添加新的 header - 日期,并在 csv[=15= 的每一行中添加值 (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')
请帮忙,谢谢你的时间和精力
抱歉,我知道我不适合你,但如果我是你,我会尽量让事情变得简单。实际上,大多数系统如果保持简单并且更易于维护和共享(KISS 原则),则效果最佳。因此,假设您使用的是本地计算机,我假设您有足够的网络带宽和足够的磁盘 space 和内存。所以我会毫不犹豫的下载文件,修改,再上传。即使在处理大文件时也是如此。
那么,如果您愿意使用其他格式的文件:
download blob (csv file) as bytes
在这种情况下,针对大小和简单代码的更好解决方案是使用/将您的文件转换为 Parquet 或 Avro 格式。这些格式将大大减少您的文件大小,特别是如果您添加压缩。然后它们允许您为数据保留一个结构,这使得它们的修改更加简单。最后,您在网上有很多关于如何将这些格式与 python 一起使用的资源,以及 CSV、Avro 和 Parquet 之间的比较。
据我了解,您想修改存储桶中的 CSV 文件而不将其下载到本地计算机文件系统。
您 cannot directly edit 来自 Cloud Storage Bucket 的文件,除了它的元数据,因此您需要以某种方式将它下载到本地计算机并将更改推送到存储桶。
Objects are immutable, which means that an uploaded object cannot change throughout its storage lifetime.
但是,一种方法是使用 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 中加入。
感谢阅读。
我在处理 Bucket 中的 csv 文件时遇到一些问题,我知道如何 copy/rename/move 文件,但我不知道如何在不下载到本地计算机的情况下修改文件。
实际上我有一个主要想法,它以字节形式下载 blob(csv 文件),然后修改并以字节形式上传到 Bucket。但是我不明白如何修改字节。
我应该如何接触 csv:添加新的 header - 日期,并在 csv[=15= 的每一行中添加值 (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')
请帮忙,谢谢你的时间和精力
抱歉,我知道我不适合你,但如果我是你,我会尽量让事情变得简单。实际上,大多数系统如果保持简单并且更易于维护和共享(KISS 原则),则效果最佳。因此,假设您使用的是本地计算机,我假设您有足够的网络带宽和足够的磁盘 space 和内存。所以我会毫不犹豫的下载文件,修改,再上传。即使在处理大文件时也是如此。
那么,如果您愿意使用其他格式的文件:
download blob (csv file) as bytes
在这种情况下,针对大小和简单代码的更好解决方案是使用/将您的文件转换为 Parquet 或 Avro 格式。这些格式将大大减少您的文件大小,特别是如果您添加压缩。然后它们允许您为数据保留一个结构,这使得它们的修改更加简单。最后,您在网上有很多关于如何将这些格式与 python 一起使用的资源,以及 CSV、Avro 和 Parquet 之间的比较。
据我了解,您想修改存储桶中的 CSV 文件而不将其下载到本地计算机文件系统。
您 cannot directly edit 来自 Cloud Storage Bucket 的文件,除了它的元数据,因此您需要以某种方式将它下载到本地计算机并将更改推送到存储桶。
Objects are immutable, which means that an uploaded object cannot change throughout its storage lifetime.
但是,一种方法是使用 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 中加入。