我想创建一个脚本,在其中我使用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
}
}
答案 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)