谢谢阅读。
我在接触 Bucket 中的 csv 文件时遇到了一些问题,我知道如何复制/重命名/移动文件,但我不知道如何在不下载到本地机器的情况下修改文件。
实际上我有一个主要的想法,它的下载 blob(csv 文件)作为字节然后修改并作为字节上传到存储桶。但我不明白如何修改字节。
我应该如何触摸 csv:添加新的标题 - 日期,并在 csv 的每一行中添加值(today.date)
---INPUT--- 存储桶中的 CSV 文件:
一种 | 乙 |
---|---|
1 | 2 |
--OUTPUT--- 更新了 Bucket 中的 CSV 文件:
一种 | 乙 | 日期 |
---|---|---|
1 | 2 | 今天 |
我的代码:
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')
请帮忙,谢谢你的时间和精力
如果我理解,您想修改存储桶中的 CSV 文件而不将其下载到本地机器文件系统。
除了元数据之外,您无法直接从 Cloud Storage Bucket编辑文件,因此您需要以某种方式将其下载到本地计算机并将更改推送到存储桶。
对象是不可变的,这意味着上传的对象在其整个存储生命周期内不能更改。
但是,一种方法是使用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 命令。为此,您需要修改上面的代码,以便每次只编辑 CSV 文件的某些部分,上传,然后gsutil compose
在 Cloud Storage 中加入。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句