备忘录数据宜存为JSON格式:Python内置json模块支持结构化、可嵌套、易读写,配合异常处理、临时文件原子写入及UTF-8编码,兼顾安全性与可维护性。

备忘录数据该存成什么格式才好改又不怕丢
直接用 .txt 存纯文本最省事,但增删某条记录时得重写整个文件,容易出错;用 json 是更稳妥的选择——Python 自带 json 模块,结构清晰,支持嵌套字段(比如加个 "created_at" 时间戳),而且读写都是原子操作(先读进内存、改完再一次性写回)。别碰 pickle,它不跨 Python 版本,还可能反序列化恶意代码。
推荐结构示例:
[{"id": 1, "content": "买牛奶", "done": false, "created_at": "2024-05-20T09:30:00"}, {"id": 2, "content": "回邮件", "done": true, "created_at": "2024-05-20T10:15:00"}]
怎么安全地读写 JSON 文件避免崩溃
文件可能不存在、内容被手动改坏、或写入中途断电。必须加异常处理:
- 读取时用
try/except json.JSONDecodeError捕获格式错误,失败就返回空列表 - 写入前先写到临时文件(如
notes.json.tmp),成功后再os.replace()原子替换原文件 - 始终用
encoding="utf-8"打开,否则中文会乱码
关键代码片段:
def load_notes():<br> try:<br> with open("notes.json", encoding="utf-8") as f:<br> return json.load(f)<br> except (FileNotFoundError, json.JSONDecodeError):<br> return []<br><br>def save_notes(notes):<br> with open("notes.json.tmp", "w", encoding="utf-8") as f:<br> json.dump(notes, f, ensure_ascii=False, indent=2)<br> os.replace("notes.json.tmp", "notes.json")
命令行交互怎么避免输错指令就退出
用户输入 "add"、"list"、"done 3" 这类指令,别用 if/elif 链硬匹配——容易漏掉空格、大小写、多余参数。用 shlex.split() 拆分输入,再按首词分发:
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
-
"add 会议纪要"→["add", "会议纪要"],检查长度 ≥ 2 再取内容 -
"done 5"→["done", "5"],用str.isdigit()判定 ID 是否合法,别直接int()(会抛异常) - 所有未知指令统一提示
"未知命令,请输入 add/list/done/delete/help",不退出程序
ID 自增和删除后怎么保持连续性
新手常想“删了第 3 条,后面全往前挪”,其实没必要。用时间戳或自增整数当 id,但不要求连续——查某条记录时只靠 id 精确匹配,列表展示时用 enumerate() 动态编号(显示为 1、2、3…),和实际 id 分离。这样删除不会影响其他记录的 ID,也避免并发写入时的竞态问题。
展示逻辑示例:
for i, note in enumerate(notes, 1):<br> status = "✓" if note["done"] else "○"<br> print(f"{i}. {status} {note['content']}")
这里 i 是屏幕序号,note["id"] 是存储 ID,两者互不干扰。
真正麻烦的是文件权限和多进程同时写——单机脚本暂不考虑,但如果未来扩展成 Web 版,就得换 SQLite 或加文件锁。现在先守住 JSON + 原子写入这道线就够了。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










