0

我正在尝试使用 python 将 json 对象列表写入谷歌云中的文件。我能够在文件中写入单个对象。但是当我尝试在 for 循环中编写它时它不起作用。

这是适用于单个对象但在我迭代编写时不起作用的代码


from google.cloud import storage
import json

bucket_name = 'gcs_bucket_user'
bucket = storage.Client().get_bucket(bucket_name)

for i in range(0,5):
    json_object = {'i': 'i'}
    blob = bucket.blob('text.json')
    blob.upload_from_string(data=json.dumps(json_object),content_type='application/json')

Expected Output
{'0':'0'}
{'1':'1'}
{'2':2}
and so on 

但这不是在 json 文件中附加对象。它正在覆盖它们。

还有从谷歌云中的这样一个文件中迭代读取json对象的方法是什么

4

2 回答 2

4

我不熟悉云存储的具体细节;但是看起来您正在用每个循环覆盖文件。

首先,json_object = {'i': 'i'}对每个循环都没有影响,因为您需要指定一个变量。

其次,我将尝试用一个代码示例来说明。

from google.cloud import storage
import json

bucket_name = 'gcs_bucket_user'
bucket = storage.Client().get_bucket(bucket_name)
# define a dummy dict
some_json_object = {'foo': list()}

for i in range(0, 5):
    some_json_object['foo'].append(i)

blob = bucket.blob('text.json')
# take the upload outside of the for-loop otherwise you keep overwriting the whole file
blob.upload_from_string(data=json.dumps(some_json_object),content_type='application/json')  

将文件上传置于循环之外,并将所有数据批量附加到文件中。

在您的情况下,您可以通过将新行缝合到文件中来模拟列表中的批量上传,方法类似于:"\n".join(['I', 'would', 'expect', 'multiple', 'lines'])或使用本机方法进行更新(如果可用)。

于 2020-07-10T09:59:30.763 回答
2

至于谷歌云存储文档

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

因此,如果您想附加到一个对象,那么唯一的方法是:

  1. 您可以在上传到 Google Cloud Storage 之前将其合并
  2. 或者每次上传时,您都必须下载已经存在的内容,将其与本地的新数据合并,然后再上传回来。
于 2020-07-10T09:59:46.380 回答