Python-当json对象的编号更高时打印

时间:2018-12-27 15:39:03

标签: python json for-loop

我想创建一个脚本,在其中我使用while函数检查json文件的次数。里面有一个看起来像json的

    {  
   "names":[  
      {  
         "name":"hello",
         "numbers":0
      },
      {  
         "name":"stack",
         "numbers":1
      },
      {  
         "name":"over",
         "numbers":2
      },
      {  
         "name":"flow",
         "numbers":12
      },
      {  
         "name":"how",
         "numbers":17
      },
      {  
         "name":"are",
         "numbers":11
      },
      {  
         "name":"you",
         "numbers":18
      },
      {  
         "name":"today",
         "numbers":6
      },
      {  
         "name":"merry",
         "numbers":4
      },
      {  
         "name":"x",
         "numbers":1
      },
      {  
         "name":"mass",
         "numbers":0
      },
      {  
         "name":"santa",
         "numbers":4
      },
      {  
         "name":"hohoho",
         "numbers":1
      }
   ]
}

我想做的是,如果每个名称的数字都比以前的json外观增加了,我想检查每个数字。

def script():

    with open('data.json') as f:
        old_data = json.load(f)


    while True:
        with open('data.json') as f:
            new_data = json.load(f)

        if old_data < new_data:

            print("Bigger!!" + new_data['name'])
            old_data = new_data

        else:
            randomtime = random.randint(5, 15)
            print("Nothing increased")
            old_data = new_data
            time.sleep(randomtime)

现在我知道我做错了,这就是我在这里的原因。目前我还不知道该怎么做才能创建一种函数,该函数按数字检查数字以查看其是否变大。

我的问题是:

我如何做到这一点,以便逐个对象地检查数字是否比上一个循环更大?如果它没有变大但变小,它应该更新old_data的值并永久循环直到 numbers 变得比以前的循环大吗?

编辑:

我从@Karl得到的推荐

{
  'names': {
    'hello': 0,
    'stack': 0,
    'over': 2,
    'flow': 12,
    'how': 17,
    'are': 11,
    'you': 18,
    'today': 6,
    'merry': 4,
    'x': 1,
    'mass': 0,
    'santa': 4,
    'hohoho': 1
  }
}

2 个答案:

答案 0 :(得分:1)

我带了您原始的.json,您将其编辑并提交给问题,然后将代码重构为以下示例。它似乎正在工作。

import time
import random
import json

path_to_file = r"C:\path\to\.json"
def script():
    with open(path_to_file) as f:
        d = json.load(f)
    old_data = 0
    for a_list in d.values():
        for i in a_list:
            print()
            for d_keys, d_values in i.items():
                print(d_keys, d_values)
                if type(d_values) == int and d_values > old_data:
                    print("Bigger!!" + i['name'])
                    old_data = d_values
                elif type(d_values) == int and d_values < old_data:
                    print("Nothing increased")
                    old_data = d_values
                    randomtime = random.randint(5, 15)
                    time.sleep(randomtime)   
script()

这是我收到的输出:

  

您好数字0

     

名称堆栈号1大!堆栈

     

名字超过数字2大!超过

     

姓名流编号12大!流

     

命名数字17更大!如何

     

名字是数字11没有增加

     

给你起18个更大的名字!!

     

今天的名字数字6没有增加

     

快活的名字4没有增加

     

名字x数字1没有增加

     

名字质量数0没有增加

     

将圣诞老人命名为更大的4个圣诞老人!

     

姓名hohoho数字1没有增加

答案 1 :(得分:1)

假设您的json格式如下:

{
  "names": {
    "hello": 0,
    "stack": 1,
    "over": 2,
    "flow": 13,
    "how": 17,
    "are": 12,
    "you": 18,
    "today": 6,
    "merry": 4,
    "x": 1,
    "mass": 0,
    "santa": 4,
    "hohoho": 1
  }
}

我会按照以下方式做些事情:

import json
import time

with open("data.json") as f:
    old_data = json.load(f)["names"]


while True:
    with open("data.json") as f:
        new_data = json.load(f)["names"]

    for name, number in new_data.items():
        if number > old_data[name]:
            print("Entry '{0}' has increased from {1} to {2}".format(name, old_data[name], number))

    old_data = new_data

    print("sleeping for 5 seconds")
    time.sleep(5)

编辑以回答评论中的问题“只是好奇,如果我要在数字等“堆栈”旁边添加另一个值,请问:1,是(每种格式的是和否),需要做什么在那种情况下(只是我要从中开发的脚本)”。

在这种情况下,您应该按以下方式设计json输入:

{
  "names": {
    "hello": {
      "number": 0,
      "status": true
    },
    "stack": {
      "number": 1,
      "status": true
    },
    "over": {
      "number": 2,
      "status": false
    },
    ...  
  }
}

您需要按如下所示更改比较脚本中的查找:

for name, values in new_data.items():
    if values["number"] > old_data[name]["number"] 

(请注意,对于status,您也可以只将"yes""no"作为输入,但是当必须表示这样的二进制选择时,使用布尔值将更加有用)。

顺便说一句,除非您打算在此json中使用names以外的对象,否则可以忽略该级别并直接创建它:

{
  "hello": {
    "number": 0,
    "status": true
  },
  "stack": {
    "number": 1,
    "status": true
  },
  "over": {
    "number": 2,
    "status": false
  },
  ...
}

在这种情况下,将old_data = json.load(f)["names"]替换为old_data = json.load(f),将new_data= json.load(f)["names"]替换为new_data= json.load(f)