问题描述
我正在使用 ijson.kvitems 迭代我拥有的 JSON 文件中的所有键。
JSON 文件如下所示:
{"filename":{"file_data":
{"name":"samplefile","filetype":"Miscellaneous","id":123,"timestamp":"2020-10-08 00:20:00"}}}
基于 this answer,我的代码的简化版本看起来像这样(v 也是一个字典):
import ijson
f = open('file.json')
for k,v in ijson.kvitems(f,''):
name = v['name']
user_id = v['id']
filetype = v['filetype']
timestamp = v['timestamp']
我只能以这种方式从原始文件中流式传输/读取大约 94% 的密钥,试图找出是否有办法获得剩余的 6%。
谢谢!!
解决方法
kvitems
的文档可能并不完全清楚:它返回给定前缀的键/值对,并且它不是递归的。使用您的示例文档和代码,这就是 kvitems
返回的内容(请注意,截至撰写本文时,ijson.dump
还没有出现在最新的 PyPI ijson 版本上,但在最新的 master
版本上可用GitHub):
echo '{
"filename": {
"file_data": {
"name":"samplefile","filetype":"Miscellaneous","id":123,"timestamp":"2020-10-08 00:20:00"
}
}
}' | python -m ijson.dump -m kvitems
#: key,value
-------------
0: filename,{'file_data': {'name': 'samplefile','filetype': 'Miscellaneous','id': 123,'timestamp': '2020-10-08 00:20:00'}}
这里的 key
是 filename
,而 value
是对象的其余部分,因为整个对象是 filename
下的值。特别是像 name
或 filetype
这样的键不会单独报告;如果您希望报告这些(及其各自的值),则必须改用 filename.file_data
前缀。
根据原始问题中的评论,我猜这是实际问题,但无法在此处添加更广泛的评论以进一步澄清问题,并希望这也是您问题的实际答案。
>