我有第一个云函数,在这个函数中,我正在编写来自云存储中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的结果,或者如何使用第二个函数来读取它?
发布于 2022-02-21 21:37:48
很多事情。
首先,StringIO返回一个可以读写的对象。所以,如果打印对象,在输出中有内存引用,这是完全可以的。
然后,您有一个要在JSON中解析的字符串。您必须使用json.loads(content),而不是转储(转储是用来以JSON格式将dict写入字符串)。
最后,如果您的文件(在中)看起来很奇怪,那么JSON :键和值必须有双引号,而您的示例中只有简单的引用。您不能在代码中加载损坏的JSON,在将其写入GCS之前,请确保API答案是有效的JSON。
https://stackoverflow.com/questions/71209123
复制相似问题