Python程序两次执行间能否在单个脚本内保存更新后的嵌套列表?
单文件内保存嵌套列表状态的几种方法
如果不想用外部文件,只能把数据存在脚本本身里,下面是两个实用的实现思路:
方法一:将数据存在脚本末尾的特殊注释块(推荐用JSON序列化)
这种方法是在脚本末尾用固定标记的注释块存储JSON格式的数据,程序启动时读取解析,更新后再写回注释块。
示例代码:
import json import os # 定义数据存储的标记 START_MARKER = "# --- SAVED_DATA_START ---" END_MARKER = "# --- SAVED_DATA_END ---" DEFAULT_DATA = [["a", 1], ["b", 2]] def load_data(): script_path = os.path.abspath(__file__) with open(script_path, "r", encoding="utf-8") as f: content = f.read() # 找到数据块的位置 start_idx = content.find(START_MARKER) end_idx = content.find(END_MARKER) if start_idx == -1 or end_idx == -1: # 第一次运行,返回默认数据 return DEFAULT_DATA # 提取并解析数据 data_str = content[start_idx + len(START_MARKER):end_idx].strip() try: return json.loads(data_str) except json.JSONDecodeError: # 数据损坏时返回默认值 return DEFAULT_DATA def save_data(data): script_path = os.path.abspath(__file__) with open(script_path, "r", encoding="utf-8") as f: content = f.read() start_idx = content.find(START_MARKER) end_idx = content.find(END_MARKER) data_str = json.dumps(data, indent=2) if start_idx == -1 or end_idx == -1: # 第一次运行,在文件末尾添加数据块 new_content = content + "\n" + START_MARKER + "\n" + data_str + "\n" + END_MARKER else: # 替换旧数据 new_content = content[:start_idx + len(START_MARKER)] + "\n" + data_str + "\n" + content[end_idx:] with open(script_path, "w", encoding="utf-8") as f: f.write(new_content) # 示例用法 if __name__ == "__main__": my_list = load_data() print("当前数据:", my_list) # 更新数据 my_list.append(["c", 3]) save_data(my_list) print("更新后的数据已保存")
第一次运行后,脚本末尾会自动添加:
# --- SAVED_DATA_START --- [ [ "a", 1 ], [ "b", 2 ], [ "c", 3 ] ] # --- SAVED_DATA_END ---
方法二:直接修改脚本内的变量定义
这种思路是在脚本里定义一个专门的变量存储数据,程序运行时用正则找到这个变量的行,替换成更新后的内容。
示例代码:
import re import os # 初始数据 saved_list = [["a", 1], ["b", 2]] def save_list(): script_path = os.path.abspath(__file__) with open(script_path, "r", encoding="utf-8") as f: content = f.read() # 用正则匹配saved_list的定义行 pattern = r"saved_list = .+" new_line = f"saved_list = {repr(saved_list)}" # 替换所有匹配的行(确保只替换一次) new_content = re.sub(pattern, new_line, content, count=1) with open(script_path, "w", encoding="utf-8") as f: f.write(new_content) # 示例用法 if __name__ == "__main__": print("当前数据:", saved_list) # 更新数据 saved_list.append(["c", 3]) save_list() print("更新后的数据已保存")
运行后,脚本里的saved_list = ...行会自动更新为新的列表内容。
注意事项
- 这两种方法都是直接修改脚本文件本身,一定要备份好原脚本,避免写入失败导致代码损坏。
- 如果嵌套列表里包含JSON无法序列化的对象(比如自定义类实例、函数),可以把方法一里的JSON换成
pickle,但要注意用base64编码避免特殊字符破坏脚本:import pickle import base64 # 序列化 data_str = base64.b64encode(pickle.dumps(data)).decode("utf-8") # 反序列化 data = pickle.loads(base64.b64decode(data_str)) - 这类方法适合小型工具脚本,不建议在大型项目或生产环境中使用。
内容的提问来源于stack exchange,提问作者NobodySpecial
相关产品推荐
相关产品推荐

