Python - печать, когда объект json получает большее число - PullRequest
0 голосов
/ 27 декабря 2018

Я хочу создать скрипт, где я проверяю время от времени json-файл, используя функцию while.Там есть 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 и зацикливаться до тех пор, пока числа не станут больше, чем предыдущий цикл?

EDIT:

Рекомендация, которую я получил от @ 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 голосов
/ 27 декабря 2018

Предполагая, что ваш 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)

0 голосов
/ 27 декабря 2018

Я взял ваш исходный файл .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 Bigger !! stack

nameнад числами 2 Больше !! более

имя потока чисел 12 Больше !! поток

имя числа 17 Больше !! как

имя числа 11 Ничего не увеличено

назови свои числа 18 Больше !! ты

назови сегодня номера 6 Ничего не увеличилось

Назови веселые числа 4 Ничего не увеличилось

Назови x числа 1 Ничего не увеличилось

имя массовых чисел 0 Ничего не увеличено

имя Санта чисел 4 Больше !! Санта

имя Хохохо числа 1 Ничего не увеличено

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...