python,利用可变对象实现设置参数的自动回存
需求:json格式的设置文件,当设置文件的某一个设置值在使用中被改变,自动回存json文件。
demo.json的内容:
{"a": {"b": {"c": {"d": {"e": ["first"]}}}} }
将['a']['b']['c']['d']['e'],这个多层的内容值设置为一个变量,当变量在使用中被改变之后,要求将自动其回存至json文件,而不用手动地再次输入['a']['b']['c']['d']['e']这样复杂的结构。
实现的脚本:
import json# 读取JSON文件并分配参数
def read_json():global json_data, varwith open('..\JSON\demo.json', 'r', encoding='utf-8') as file_json:json_data = json.load(file_json)var = json_data['a']['b']['c']['d']['e'] # 变量的定义。变量指向了一个列表print(f'初始变量的内容为{var}')read_json()# 退出前
def before_quit():global json_data# 回存json文件with open('..\JSON\demo.json', 'w') as file:json.dump(json_data, file, indent=4)while True:user_input = input("请输入内容 (输入 'xxx' 退出): ")if user_input.lower() == 'xxx':before_quit()print("程序结束。")breakvar[0] = user_input # 修改变量所指向的列表的元素的值print(f"最后一次的输入: {user_input}")
代码解释和运行结果:
1、
# 读取JSON文件并分配参数
def read_json():global json_data, varwith open('..\JSON\demo.json', 'r', encoding='utf-8') as file_json:json_data = json.load(file_json)var = json_data['a']['b']['c']['d']['e'] # 变量的定义。变量指向了一个列表print(f'初始变量的内容为{var}')
这里,定义了两个变量json_data和var,这两个变量都指向和包含指向了同一个列表,其初始内容为[ "first" ]。我们知道,一个列表,它的内存地址是固定的,但它的元素内容是可变的,利用这个特性就可以实现变量的传递。
2、
while True:user_input = input("请输入内容 (输入 'xxx' 退出): ")if user_input.lower() == 'xxx':before_quit()print("程序结束。")breakvar[0] = user_input # 修改变量所指向的列表的元素的值print(f"最后一次的输入: {user_input}")
var[0] = user_input:当用户输入内容后,var这个变量指向的列表的[0]这个元素被修改为输入的内容。我们知道,json_data也包含指向了这个列表,因此当var[0] 变量发生改变时,json_data的内容实际上也就随之改变了。
3、
def before_quit():global json_data# 回存json文件with open('..\JSON\demo.json', 'w') as file:json.dump(json_data, file, indent=4)
将改变后的json_data的内容写回json文件。
4、运行的结果记录:
第一次运行:
记住,第一次运行,最后一次输入的内容是”3“ 。
第二次运行:
可以看到,第二次运行的时候,第一次运行的最后一次输入的内容”3“被正确记录和读取了。