Python脚本保存命令行参数到JSON时出现列表嵌套问题
问题根因
出现嵌套列表、功能不符合预期是3个逻辑错误导致的:
- 列表方法使用错误:
sys.argv[1:]本身就是存储所有命令行参数的列表,用append()方法会把整个参数列表作为单个元素存入空列表,直接生成[ [参数1, 参数2, ...] ]的嵌套结构。 - 文件操作逻辑错误:使用
a+追加模式打开文件,会导致多次运行后文件内拼接多段JSON内容,变成无法解析的非法格式;且代码中手动打开的文件句柄根本没有被后续读写函数使用,属于无效操作。 - 流程顺序错误:每次运行都重新初始化空列表
my_list = [],完全没有读取文件内已存储的历史内容,之前保存的参数会被直接覆盖。
修正后可运行代码
#!/usr/bin/python3 import sys import os save_to_json_file = __import__('5-save_to_json_file').save_to_json_file load_from_json_file = __import__('6-load_from_json_file').load_from_json_file filename = "add_item.json" # 文件存在则加载历史列表,不存在则初始化为空列表 if os.path.exists(filename): my_list = load_from_json_file(filename) else: my_list = [] # 逐个添加新传入的命令行参数,不会生成嵌套结构 my_list.extend(sys.argv[1:]) # 全量覆盖写入文件,保证JSON格式合法 save_to_json_file(my_list, filename)
关键改动说明
- 将
my_list.append(args[1:])替换为my_list.extend(sys.argv[1:]):extend会把传入可迭代对象的每个元素逐个加入列表,从根源避免嵌套结构。 - 移除冗余的手动文件打开逻辑:
save_to_json_file和load_from_json_file会自行处理文件的打开关闭,不需要提前手动操作文件。 - 增加历史内容加载步骤:脚本启动优先读取已存储的列表数据,再追加新参数,不会丢失之前保存的内容。
- 改用覆盖写入模式:由
save_to_json_file默认通过w模式写入完整JSON结构,避免追加模式导致的文件格式损坏。
内容的提问来源于stack exchange,提问作者Eiden Martinez Davila
相关产品推荐
相关产品推荐

