国庆节10月1日
--


datetime 生成时间戳与会话标识,os 模块读写环境变量、判断与创建目录、遍历删除文件

会话管理里需要一个”唯一的名字”来区分每个会话,用当前时间是最省事的做法。
1from datetime import datetime2
3# %Y-%m-%d_%H-%M-%S: %Y - 年 , %m - 月, %d - 日, %H - 小时, %M - 分钟, %S - 秒4print(datetime.now().strftime("%Y-%m-%d_%H-%M-%S"))输出示例:2026-01-11_18-00-05
| 占位符 | 含义 | 示例 |
|---|---|---|
%Y | 年(4 位) | 2026 |
%m | 月(2 位) | 01 |
%d | 日(2 位) | 11 |
%H | 小时(24 小时制) | 18 |
%M | 分钟 | 00 |
%S | 秒 | 05 |
格式串 "%Y-%m-%d_%H-%M-%S" 里把日期用 -、时间用 -、中间用 _ 分隔,是为了让文件名既好读、又不会包含非法字符(Windows 文件名不允许 : / 等符号)。
用时间做标识的前提是格式化精确到秒。同一秒内点了两次”新建会话”会得到重名——课程项目里靠”聊天记录为空时不重复新建”来规避(见 会话管理)。
os 是 Python 的标准库,用来和操作系统打交道。本章项目用到了五处:
| 用法 | 作用 | 项目中的场景 |
|---|---|---|
os.environ.get('DEEPSEEK_API_KEY') | 读取环境变量 | 取 API Key,避免硬编码 |
os.path.exists("sessions") | 判断路径是否存在 | 存盘前判断目录要不要创建、加载前判断文件在不在 |
os.mkdir("sessions") | 创建目录(单级) | 第一次保存会话时创建 sessions 目录 |
os.listdir("sessions") | 列出目录下所有文件名 | 展示历史会话列表 |
os.remove(path) | 删除文件 | 删除指定的历史会话 |
1import os2
3# 判断目录是否存在, 不存在则创建4if not os.path.exists("sessions"):5 os.mkdir("sessions")6
7# 列出目录下的所有文件8file_list = os.listdir("sessions")9for filename in file_list:10 if filename.endswith(".json"):11 print(filename[:-5]) # 切片去掉结尾的 .json12
13# 删除文件14if os.path.exists("sessions/2026-01-11_18-00-05.json"):15 os.remove("sessions/2026-01-11_18-00-05.json")os.mkdir() 只能创建一级目录,而且目录已存在时会抛 FileExistsError;要一次创建多级目录用 os.makedirs(path, exist_ok=True)。
filename[:-5] 是字符串切片:-5 表示从末尾往前数 5 个字符,正好去掉 .json 这 5 个字符。更直观的写法是 filename.removesuffix(".json")(Python 3.9+)。
代码里用 os.environ.get(...) 读,值要靠环境变量传进去:
| 环境 | 设置方式 |
|---|---|
| Windows CMD | set DEEPSEEK_API_KEY=sk-xxxx |
| Windows PowerShell | $env:DEEPSEEK_API_KEY="sk-xxxx" |
| macOS / Linux | export DEEPSEEK_API_KEY=sk-xxxx |
| PyCharm | 运行配置 → Environment variables 里添加 |
API Key 属于密钥,不能写死在代码里。一旦写死又提交到 Git 仓库,就等于公开泄露(密钥会被扫描器批量收割)。放环境变量是最基本的做法。
datetime.now().strftime("%Y-%m-%d_%H-%M-%S")%Y = 年、%m = 月、%d = 日、%H = 小时、%M = 分钟、%S = 秒os.environ.get("DEEPSEEK_API_KEY")os.path.exists("sessions")os.mkdir("sessions")(目录已存在会抛 FileExistsError 错误)os.listdir("sessions")os.remove(path)filename[:-5] 的作用是去掉结尾的 .json(5 个字符) 2-1 生成会话标识
打印一个形如 2026-01-11_18-00-05 的时间字符串;再打印一个中文格式的日期,如 2026年01月11日。
一级 · 思路:取当前时间 → 用格式化字符串拼成想要的样式
二级 · 方法:datetime.now().strftime("格式串")
三级 · 骨架:中文格式就是格式串里直接写中文:"%Y年%m月%d日"
1from datetime import datetime2
3# 会话标识格式4print(datetime.now().strftime("%Y-%m-%d_%H-%M-%S"))5
6# 中文日期格式(格式串里可以直接写中文)7print(datetime.now().strftime("%Y年%m月%d日"))8
9# 连续运行两次,秒数不同(同一个脚本里两次 now() 也会不同) 2-2 目录准备与列目录
写一个函数:如果 sessions 目录不存在就创建;然后列出该目录下所有 .json 文件名(去掉扩展名后打印)。
一级 · 思路:先判断再创建;列出来的文件名要筛一遍再切掉后缀
二级 · 方法:os.path.exists / os.mkdir / os.listdir / endswith(".json")
三级 · 骨架:if not os.path.____("sessions"):
1import os2
3# 1. 目录不存在就创建4if not os.path.exists("sessions"):5 os.mkdir("sessions")6
7# 2. 造两个 json 文件8with open("sessions/2026-01-11_18-00-05.json", "w", encoding="utf-8") as f:9 f.write("{}")10with open("sessions/2026-01-11_18-04-42.json", "w", encoding="utf-8") as f:11 f.write("{}")12
13# 3. 列出 .json 文件并去掉后缀14session_list = []15for filename in os.listdir("sessions"):16 if filename.endswith(".json"):17 session_list.append(filename[:-5])18session_list.sort(reverse=True)19print(session_list) 2-3 安全地删除文件
写一个函数:先创建一个临时文件(如 temp_demo.txt)并写入内容,再判断它存在后删除它,最后再列一次目录确认删掉了。
一级 · 思路:删除前一定先判断存在,否则会抛异常
二级 · 方法:os.path.exists / os.remove
三级 · 骨架:if os.path.____(path): os.____(path)
1import os2
3# 1. 创建临时文件4with open("temp_demo.txt", "w", encoding="utf-8") as f:5 f.write("删除我\n")6
7# 2. 判断存在后删除8if os.path.exists("temp_demo.txt"):9 os.remove("temp_demo.txt")10 print("已删除")11
12# 3. 确认13print("temp_demo.txt" in os.listdir("."))14
15# 如果不判断存在就删,会抛:FileNotFoundError如果你喜欢,那么欢迎来到我的世界!
了解更多暂未播放



"生活不是等待暴风雨过去,而是学会在雨中跳舞。"—— 塞维涅夫人


