You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 15:35:28