【发布时间】:2019-12-31 12:26:46
【问题描述】:
我在在下面的块中有效地存储 PhoneNumber 值时遇到了问题
response = requests.get(api)
data = json.loads(response.text)
所以在完成上述操作后,我有一个字典“数据”,如下所示:
{'Key1': 'Some Value ', 'Key2': [{'PhoneNumber': '180000000000'}]}
我们的目标是只获取 PhoneNumber 值,即'180000000000',我的第一反应是下面这个可行,但我知道这不会很好地扩展。想知道在上面的 json.loads 调用中我是否可以传递一个参数,或者是否有人对如何更有效地获得我感兴趣的这个值有其他建议。
data = data['Key2'][0]['PhoneNumber'])
所以在上面的数据现在 = '180000000000' 并且我想将它存储在 s3 之后,我有一个 JSON 文件的旧代码(如下),这有效但毫无意义。我只需要将电话号码存储为文本文件(我知道如何使用 open for .txt,但我对如何使用 io.Bytes 以及是否应该使用 SringIO 而不是 BytesIO 感到困惑)
inmemory = io.BytesIO()
with gzip.GzipFile(fileobj=inmemory, mode='wb') as fh:
with io.TextIOWrapper(fh, encoding='utf-8',errors='replace') as wrapper:
wrapper.write(json.dumps(data, ensure_ascii=False,indent=2))
inmemory.seek(0)
s3_resource.Object(s3bucket, s3path + '.json.gz').upload_fileobj(inmemory)
inmemory.close()
当它像这样存储时,当我从 S3 中提取值时,我必须使用“with gzip.open”并对其进行解码
【问题讨论】:
-
你让事情变得比他们需要的更难——这是一个包含字典的列表。不要将您解析的数据转回字符串:
data['Key2'][0]['PhoneNumber']是您所需要的。 -
使用 json.loads 有什么意义吗?
-
是的,假设您以 json 字符串开头 —
loads将其转换为 python 数据结构。 -
我可能会误解,但这看起来像是两个独立的问题(自编辑以来):一个询问如何更有效地检索电话号码,另一个询问
BytesIO。也许这应该分成两个单独的 SO 帖子? -
嗨,克里斯,你是对的,我再次道歉,这应该是一个单独的问题
标签: python json amazon-web-services api amazon-s3