在Python字典中从用户动态获取输入

时间:2019-06-14 17:59:27

标签: json python-3.x

我创建了如下的Python字典结构:

import pprint
log_data = {
    'Date':'',
    'Prayers':{
        'Fajr':'',
        'Dhuhr/Jumu\'ah':'',
        'Asr':'',
        'Maghrib':'',
        'Isha\'a':''
        },
    'Task List':[{
        'Task':'',
        'Timeline':'',
        'Status':''
    }],
    'Meals':{
        'Breakfast':{
            'Menu':'',
            'Place':'',
            'Time':''
        },
        'Lunch':{
            'Menu':'',
            'Place':'',
            'Time':''
        },
        'Evening Snacks':{
            'Menu':'',
            'Place':'',
            'Time':''
        },
        'Dinner':{
            'Menu':'',
            'Place':'',
            'Time':''
        }         
    },
    'Exercises':[{
        'Exercise':'',
        'Duration':''
    }]
} 
pprint.pprint(log_data)

如您所见,这只是一个没有数据的字典结构。我想遍历所有键,并使用input()将输入数据作为用户的值。 然后我想将此字典另存为json文件。 您能否在我如何遍历所有键并接受用户输入方面提供帮助。 谢谢。 搜索了但找不到我需要的确切帮助类型。

1 个答案:

答案 0 :(得分:1)

对于这种事情,需要使用递归。

这不是幻想,但可以完成工作:

from copy import deepcopy
import json
import pprint


log_data =  {
    'Date':'',
    'Prayers':{
        'Fajr':'',
        'Dhuhr/Jumu\'ah':'',
        'Asr':'',
        'Maghrib':'',
        'Isha\'a':''
        },
    'Task List':[{
        'Task':'',
        'Timeline':'',
        'Status':''
    }],
  # ...
}
def input_fields(substruct, path=""):
    print(f"Inputing values '{path}':")
    for fieldname, value in substruct.items():
        if isinstance(value, (str, int)):
            substruct[fieldname] = input(f"{path}.{fieldname}: ")
        elif isinstance(value, dict):
            input_fields(value, f"{path}.{fieldname}")
        elif isinstance(value, list):
            original = value[0]
            value.pop()
            counter = 0
            if not isinstance(original, dict):
                raise ValueError("Not supported: A list should contain a dictionary-substructure")
            while True:
                item = deepcopy(original)
                input_fields(item, f"{path}.{fieldname}.[{counter}]")
                value.append(item)
                continue_ = input(f"Enter one more {path}.{fieldname} item? (y/n) ").lower().strip()[0] == "y"
                if not continue_:
                    break
                counter+=1
    return substruct

def main():
    values = input_fields(deepcopy(log_data))
    json.dump(values, open("myfile.json", "wt"), indent=4)

if __name__ == "__main__":
    main()