【问题标题】:Python JSON keys without parse没有解析的 Python JSON 键
【发布时间】:2013-03-27 02:24:39
【问题描述】:

我需要从包含大约 70.000 个(子)键/对象的 JSON 格式文本中获取主键(设备) 它看起来像这样:

{
   "1":{...........}
   "4":{...........}
   "9":{...........}
}

我需要得到“1”、“4”和“9”。但是我现在这样做的方式需要大约 2 分钟来解析文本与

json = json.loads(response.text) #this takes so long!
devices = json.keys()

因为我在树莓派上运行它!

有没有更好的办法?

编辑: 我从运行在服务器上的 JSON API 接收数据:

http://.../ZWaveAPI/Run/devices #this is an array

EDIT3:

最终工作代码:(运行 2-5 秒!:)

import ijson.backends.python as ijson
import urllib

parser = ijson.parse(urllib.urlopen("http://.../ZWaveAPI/Run/devices"))
list = []
for prefix,event,value in parser:
    if event == "map_key" and len(prefix) == 0:
        list.append(value)
return list

【问题讨论】:

  • 使用数据库,只在需要时才查询?
  • 我无法更改我得到的数据...我收到一个包含许多键的文本,我需要获取主键...或者我获取数据的方式有可能? (见编辑)

标签: python json parsing


【解决方案1】:

您可以使用面向流的迭代 JSON 解析器来执行此操作,但您需要单独安装它。试试ijson,它会为遇到的每个 JSON 结构发出事件:

for prefix, event, value in parser:
    if event == 'map_key':
        print value

【讨论】:

  • 但是这只会在解析的时候调用事件,不是更快,是吗?
  • 它将让您更快地访问中间结果,因为您将在整个加载之前获得它们。它还将使用更少的内存,因为您不会构建一个充满您不会使用的东西的巨大数据结构。所以它至少应该更快一些。
  • @TeNNoX:您必须扫描中间结果 无论如何 才能找到您感兴趣的键。但是使用流解析器,您不需要创建 python整个数据集的对象,从而加快速度。
  • 好的,那我试试。但是事件并不是真正必要的,因为无论如何我都需要等待一切完成,对吧?
  • @TeNNoX:它需要一个类似文件的对象;传入urlopen() 的结果而不自己调用.read()
【解决方案2】:

您是否尝试过只购买一台设备?对于大多数 RESTful Web 服务,如果您看到这样的 URL:

"h ttp://.../ZWaveAPI/Run/devices"

您有可能通过以下方式获得个人设备:

"h ttp://.../ZWaveAPI/Run/devices/1"

如果可行,它应该会大大减少您必须下载和解析的数据量。

【讨论】:

  • 是的,但我需要所有文件的有效列表。我无法尝试所有数字...顺便说一下,我现在使用 ijson 将时间减少到 3 秒,如 EDIT3 中所示
猜你喜欢
  • 2018-06-08
  • 2011-01-04
  • 1970-01-01
  • 1970-01-01
  • 2019-08-05
  • 2020-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多