我有一个第一个云函数,在这里我将从云存储中的API编写响应:
api_response = service.accounts().api().execute()
bucket_name = 'my_bucket'
date = datetime.today().strftime('%Y-%m-%d %H:%M:%S')
bucket = storage_client.bucket(bucket_name)
destination_blob_name = 'stuff_here/{}'.format(date)
blob = bucket.blob(destination_blob_name)
blob.upload_from_string("{}".format(api_response))
当在云存储中查看我的文件时,我有这样的东西:
{'items': [
{'path': 'foo/12066407/stuff/12396182', 'accountId': '34858', 'containerId': '475663', 'name': 'blablabla', 'usageContext': ['stuff'], 'fingerprint': '1621433559139', 'Url': 'https://randomurl.com/#/randomPath/path/12066407/id?apiLink=blabla'}]}
对于这个例子,我在数组中只有一个对象。所有对象在真实用例中都是一致的
然后我希望能够从另一个云函数中读取这个文件。
我有以下代码:
bucket = client.get_bucket('my_bucket')
blob = bucket.get_blob('filename')
content = blob.download_as_string().decode()
print(StringIO(content))
print(json.dumps(content))
my_df = pd.read_json(StringIO(content))
对于第一次打印,我有Content: <_io.StringIO object at 0x3ef722b287d0>
。对于第二次打印,我有一个文件中的副本,当试图在df中传递它时,我会出现以下错误ValueError: Expected object or value
。
最终,我希望能够提取其中一个键值对。
我应该在第一个函数中以不同的方式编写API的结果,还是如何使用第二个函数读取结果?
很多事情。
首先,StringIO返回一个可以读写的对象。所以,如果打印对象,输出中有内存引用,那就完全没问题了。
然后,您有一个字符串,您想要用JSON解析它。您必须使用json.loads(content)
而不是转储(转储用于以JSON格式将dict写入字符串(。
最后,如果你的文件(在云存储中(的JSON看起来很奇怪:键和值必须有双引号,而你的示例中只有简单的引号。您不能在代码中加载损坏的JSON,在将其写入GCS之前,请确保API答案是有效的JSON。