该示例将使用前面学习的 Python3 基础知识,实现一个简易版本的代办程序,该代办程序支持新增、修改、删除和查询代办的功能,同时通过 JSON 文件来保存代办数据。
代办清单包含如下功能:
(1)添加待办事项
(2)标记完成 / 未完成
(3)查看全部 / 仅查看未完成
(4)用字符拼接成表格展示
(5)将数据保存到文件中,程序启动时自动读取数据
注意,该示例程序使用了 Python 的 json 和 os 内置模块,其中:
json:是 Python 内置标准模块,专门用来处理 JSON 格式数据
os:是 Python 内置标准模块,让代码直接和操作系统交互,如文件、路径、文件夹、环境变量等等
示例代码:
import json
import os
class TodoItem:
"""单个待办事项类,存储内容和完成状态"""
def __init__(self, content: str):
self.content = content # 待办内容
self.is_completed = False # 完成状态,默认未完成
def mark_completed(self):
"""标记为已完成"""
self.is_completed = True
def mark_incomplete(self):
"""标记为未完成"""
self.is_completed = False
def to_dict(self):
"""转为字典,用于保存到文件"""
return {"content": self.content, "is_completed": self.is_completed}
@staticmethod
def from_dict(data):
"""从字典恢复对象,用于读取文件"""
item = TodoItem(data["content"])
item.is_completed = data["is_completed"]
return item
class TodoList:
"""TODO 清单管理类(含持久化、清空、删除)"""
def __init__(self, save_file="todo_list.json"):
self.items = [] # 存储所有待办事项
self.save_file = save_file # 持久化文件
self.load_from_file() # 启动自动加载历史数据
def add_item(self, content: str):
"""添加新待办事项"""
if not content.strip():
print("事项内容不能为空!")
return
item = TodoItem(content)
self.items.append(item)
self.save_to_file() # 自动保存
print(f"已添加事项:{content}")
def delete_item(self, index: int):
"""删除指定序号的事项"""
try:
deleted = self.items.pop(index)
self.save_to_file()
print(f"已删除事项:{deleted.content}")
except IndexError:
print("无效的事项编号!")
def clear_all(self):
"""清空所有待办事项"""
self.items.clear()
self.save_to_file()
print("已清空所有待办事项!")
def mark_item(self, index: int, completed: bool):
"""标记指定索引的事项完成/未完成"""
try:
item = self.items[index]
if completed:
item.mark_completed()
print(f"已标记完成:{item.content}")
else:
item.mark_incomplete()
print(f"已标记未完成:{item.content}")
self.save_to_file() # 修改后自动保存
except IndexError:
print("无效的事项编号!")
def show_all(self):
"""展示所有事项(表格形式)"""
self._show_table(filter_completed=None)
def show_incomplete(self):
"""仅展示未完成事项(表格形式)"""
self._show_table(filter_completed=False)
def _show_table(self, filter_completed=None):
"""内部方法:字符表格展示"""
items_to_show = []
for idx, item in enumerate(self.items):
if filter_completed is None:
items_to_show.append((idx, item))
elif not item.is_completed:
items_to_show.append((idx, item))
if not items_to_show:
print("暂无待办事项")
return
print("-" * 45)
print(f"{'序号':<5}{'状态':<8}{'内容'}")
print("-" * 45)
for idx, item in items_to_show:
status = "已完成" if item.is_completed else "未完成"
print(f"{idx:<5}{status:<8}{item.content}")
print("-" * 45)
# ==================== 持久化 ====================
def save_to_file(self):
"""保存数据到 JSON 文件"""
try:
data = [item.to_dict() for item in self.items]
with open(self.save_file, "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=2)
except Exception as e:
print(f"保存失败:{e}")
def load_from_file(self):
"""从文件加载历史数据"""
if not os.path.exists(self.save_file):
return
try:
with open(self.save_file, "r", encoding="utf-8") as f:
data_list = json.load(f)
self.items = [TodoItem.from_dict(d) for d in data_list]
except Exception as e:
print(f"加载历史数据失败:{e}")
def main():
"""主程序:命令行交互"""
todo = TodoList()
while True:
print("\n===== 功能菜单 =====")
print("1. 添加待办事项")
print("2. 标记事项为已完成")
print("3. 标记事项为未完成")
print("4. 查看所有事项")
print("5. 查看未完成事项")
print("6. 删除单个事项")
print("7. 清空所有事项")
print("0. 退出程序")
choice = input("请输入操作编号:").strip()
if choice == "1":
content = input("请输入待办内容:")
todo.add_item(content)
elif choice == "2":
idx = input("请输入要标记完成的事项序号:")
if idx.isdigit():
todo.mark_item(int(idx), completed=True)
else:
print("请输入有效数字!")
elif choice == "3":
idx = input("请输入要标记未完成的事项序号:")
if idx.isdigit():
todo.mark_item(int(idx), completed=False)
else:
print("请输入有效数字!")
elif choice == "4":
todo.show_all()
elif choice == "5":
todo.show_incomplete()
elif choice == "6":
idx = input("请输入要删除的事项序号:")
if idx.isdigit():
todo.delete_item(int(idx))
else:
print("请输入有效数字!")
elif choice == "7":
confirm = input("确定要清空所有事项吗?(y/n):")
if confirm.lower() == "y":
todo.clear_all()
else:
print("已取消清空")
elif choice == "0":
print("退出程序,数据已自动保存")
break
else:
print("无效操作,请重新输入!")
if __name__ == "__main__":
main()运行结果:
===== 功能菜单 =====
1. 添加待办事项
2. 标记事项为已完成
3. 标记事项为未完成
4. 查看所有事项
5. 查看未完成事项
6. 删除单个事项
7. 清空所有事项
0. 退出程序
请输入操作编号:1
请输入待办内容:学习python编程
已添加事项:学习python编程
===== 功能菜单 =====
1. 添加待办事项
2. 标记事项为已完成
3. 标记事项为未完成
4. 查看所有事项
5. 查看未完成事项
6. 删除单个事项
7. 清空所有事项
0. 退出程序
请输入操作编号:4
---------------------------------------------
序号 状态 内容
---------------------------------------------
0 未完成 学习python编程
---------------------------------------------
===== 功能菜单 =====
1. 添加待办事项
2. 标记事项为已完成
3. 标记事项为未完成
4. 查看所有事项
5. 查看未完成事项
6. 删除单个事项
7. 清空所有事项
0. 退出程序
请输入操作编号:1
请输入待办内容:学习AI基础知识
已添加事项:学习AI基础知识
===== 功能菜单 =====
1. 添加待办事项
2. 标记事项为已完成
3. 标记事项为未完成
4. 查看所有事项
5. 查看未完成事项
6. 删除单个事项
5. 查看未完成事项
6. 删除单个事项
6. 删除单个事项
7. 清空所有事项
0. 退出程序
请输入操作编号:5
---------------------------------------------
序号 状态 内容
---------------------------------------------
0 未完成 学习python编程
1 未完成 学习AI基础知识
---------------------------------------------
===== 功能菜单 =====
1. 添加待办事项
2. 标记事项为已完成
3. 标记事项为未完成
4. 查看所有事项
5. 查看未完成事项
6. 删除单个事项
7. 清空所有事项
0. 退出程序
请输入操作编号:0
退出程序,数据已自动保存