美文网首页
用Python探索JSON数据

用Python探索JSON数据

作者: Jason数据分析生信教室 | 来源:发表于2023-10-17 10:55 被阅读0次

最近在接触一些AI自动化的项目,发现几乎所有的传感器数据为了匹配API接口,数据格式都是JSON。这个对与常年几乎只用Data Frame的人来说一开始会很不习惯,稍微了解了一下python的递归函数,发现用递归函数可以方便好多。
本文会分4步讲解如何实现这个操作。

Step.1 最简单的递归函数

sample = ["a", "b", 1]
res = []
for v in sample:
    if isinstance(v, str):
        res.append(v)

print(res) # ["a", "b"]

寻找str构造的数据。
step.1纯属为了比较,无需多解释。

Step.2 双层数据结构的递归函数

sample = [["a", 1], "b"]

res = [] 
for arg in sample: 
  if isinstance(arg, str):
    res.append(arg)
  if isinstance(arg, list):
    for v in arg:
      if isinstance(v, str):
        res.append(v)

print(res)

step.2的话相当于把step.1拆分成了两步。虽然得到了预期的结果,但是用到了两次if条件,使得整个代码变得有点冗长。如果需要有更多步骤的话,会产生更多的for循环和if条件分叉,代码会变得更加冗长。 所以需要递归函数。递归函数的宗旨就是把大事化小,把复杂的项目分割成简单的小块。在接下来的step.3里会用到递归函数把step.2简单化。

Step.3 从n层构造序列里获取str数据

sample = ["a",["b", 1, [[["c", 2], 3], 4], "d"], ["e"]]

想要预期得到的结果如下

["a", "b", "c", "d", "e"]
def get_str(arg):
  res = []
  if isinstance(arg,str):
    res.append(arg)
  elif isinstance(arg,list):
    for v in arg:
       res += get_str(v)
  return res

print(get_str(sample))

整个函数的运行从下往上看,首先运行的是

for v in arg:
    res += get_str(v)

当然此处的arg有三种情况,分别是

①res += get_str("a")
②res += get_str(["b", 1, [[["c", 2], 3], 4], "d"])
③res += get_str(["e"])

根据条件设定,每种情况的处理如下

①res += get_str("a")

情况1的话直接把结果添加到res里,到此结束
情况2的处理如下

②res += get_str(["b", 1, [[["c", 2], 3], 4], "d"])
res += get_str("b")
res += get_str(1)
res += get_str([[["c", 2], 3], 4])
res += get_str("d")

可以看到处理的并不完整,会继续处理。
情况3的处理如下

③res += get_str(["e"])
res += get_str("e")

完整的内部操作如下:

①res += get_str("a")
>> res.append("a") *
②res += get_str(["b", 1, [[["c", 2], 3], 4], "d"])
>> res += get_str("b")
   >> res.append("b") *
   res += get_str(1)
   res += get_str([[["c", 2], 3], 4])
   >> res += get_str([["c", 2], 3)
      >> res += get_str(["c", 2])
         >> res += get_str("c")
            >> res.append("c") *
            res += get_str(2)
      res += get_str(4)
   res += get_str("d")
   >> res.append("d") *
③res += get_str(["e"])
>> res += get_str("e")
   >> res.append("e") *

其中带*的结果会最终添加(return)到res里。用这样的办法就实现了使用get_str()函数在复杂的数据中寻找并添加str类型数据。和n个for循环比起来代码更加简洁明了。

Step.4 探索JSON

在复杂的JSON数据里寻找指定数据。假设在下面的例子里找到x,y,z

sample = {
    "a": [{
        "b": "y", 
        "c": [{
            "d": [2,3]
        }], 
        "e": {"g": "z"}
        }],
        "f": ["x"],
}
def get_str(arg):
    res =[]
    if isinstance(arg, str):
        res.append(arg)
    elif isinstance(arg, list):
        for item in arg:
            res += get_str(item)
    elif isinstance(arg, dict):
        for value in arg.values():
            res += get_str(value)
    return res

print(get_str(sample)) # ["x", "y", "z"]

原理是一样的,无非就是和step3相比多了一个dict层。

相关文章

网友评论

      本文标题:用Python探索JSON数据

      本文链接:https://www.haomeiwen.com/subject/lunfidtx.html