AI智能伴侣-文件保存 会话的 保存 新建 加载 删除

文件的操作

f = open(文件地址,操作,编码) 操作"r" 读, "w" 写文件,编码encoding="utf-8"

  1. 读取文件

content = f.read()

print(content)

  1. 写入文件

f.write()

3.关闭文件

f.close()

啥是编码

是将字符(文字,数字,符号)转换为计算机能够存储和处理的数字代码的规则系统

f.close()的占用

如果操作完文件,并未调用close方法关闭文件,同时程序没有停止运行,那么这个文件将一致被Python程序占用,无法操作

当我们写文件的时候,需要注意,如果文件没存在,那么就会自动创建并写入。

如果存在,那么就会进行覆写

那么就有一个问题如果操作过程中文件出现了异常,文件就无法关闭了,怎么解决?

这个问题,一旦发送,文件就会无法及时关闭,那么就导致这个文件一致被Python占用,怎么解决呢? try,finally

无论如何,关闭这个操作都会被执行

但是,除了try/finally,还有一种办法

with语句(with语句的核心作用就是确保资源的总是被正确获取和释放(即使发生异常,也会被正确释放),也是项目开发中的推荐方式)

with open(文件地址,操作,encoding="utf-8") as f:

f.write()

f.write()

这两种方法,文件资源释放的最佳实践?

try...finally

with open()方法

我们保存会话记录时,可以将会话记录存到文件中,文件是以json的格式存储和加载,为啥要以Json格式

JSON是软件开发中最常用的数据交换格式,而是为了简化JSON数据的处理,在Python标准库中就提供了处理JSON数据的核心模块json

当我们把文件以JSON格式的形式存到文件中有个方便函数

json.dump() 序列化:

json.load(): 反序列化:

接下来展示一下写入json数据文件

with open(文件地址,"w",encoding="utf-8") as f:

json.dump(user,f)

当我们这样写的时候

就会出现中文怎么出现乱码的情况呢

因为dump底层的代码,我们发现ensure_ascii=true,这个会对非ascii码进行转义,所以我们看到的时候就会出现乱码,所以我们要将他进行取消设置,但是由于中间忽略了许多参数,所以我们要进行关键字传参

取消之后就会发现汉字能正常显示了

那么之后就是indent了,这个就是一个缩进

复制代码
with open("resources/user.txt","w",encoding="utf-8") as f:
    json.dump(user,f,ensure_ascii=False,indent=2)

效果如下

复制代码

会话管理:

首先就是 st.subheader("AI控制面板")

而新建会话这个按钮怎么办 st.button

保存当前会话信息

复制代码
if st.session_state.current_session:
    # 构建容器
    session_date = {
        "current_session": st.session_state.current_session,
        "nick_name": st.session_state.nick_name,
        "character": st.session_state.character,
        "messages": st.session_state.messages
    }

    # 创建一个session 目录不存在则创建
    if not os.path.exists("session"):
        os.mkdir("session")
    # 保存会话数据
    with open(f"session/{st.session_state.current_session}.json", "w", encoding="utf-8") as f:
        json.dump(session_date, f, ensure_ascii=False, indent=2)

序列化的前提是Python数据类型,最基本的就是字典,列表之类的

然后严谨一点,如果没有这个文件我们就创建一下,为了避免名字重复我们应该可以是使用时间名字

复制代码
if "current_session" not in st.session_state:
    st.session_state.current_session = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
可以是一时间为名字,strfitime是指定的格式
复制代码
if st.button("😃新建会话",width="stretch"):
    #保存当前会话信息
    save_session() 这个函数就是上面那段
st.button 如果点击,返回的是True,否则就False

创建一个新的会话

创建一个新的会话,我们每次点击一下,就会保存会话,然后就是

复制代码
if st.button("😃新建会话",width="stretch"):
    #保存当前会话信息
    save_session()

    # 2.创建新的会话
    st.session_state.messages=[]
    st.session_state.current_session=generate_session_id()
    save_session()

创建一个新的会话,创建一个,我们应该把上次的message情况,以及时间刷新一下

这里有个细节,st.button每按一下,并不会先执行里面的逻辑,整个页面会被渲染一下,如果chat_message().write出现的早,那么就会出现,明明新建了但是对话还在,这是因为逻辑代码后执行,我们的st.session_state.message=\[\] 实在代码里面

,所以加上st.rerun就行

加载历史会话的按钮

复制代码
# 加载所有会话列表信息
def load_session():
    session_list = []
    if os.path.exists("session"):
        for filename in os.listdir("session"):     listdir 是查看这个目录下所有的文件
            if filename.endswith(".json"):          我们找到的是以json为末尾的文件
                session_list.append(filename[:-5])
    return session_list
复制代码
#会话历史
st.text("会话历史")
session_list = load_session()
for session in session_list:
    col1,col2=st.columns([4,1])
    with col1:
        #加载会话信息
        if st.button(session,icon="😃"):
            pass
    with col2:
        if st.button("",icon="❌",key=f"delete_{session}"):
            pass

每个按键都必须有自己的key,不然会报错,❌这里最容器出错,因为当你没指定key是,他的key默认就是键名,如果没指定key,所有的名字都是"",就会报错

加载指定会话

复制代码
def load_session(session_name):
    try:
      if os.path.exists(f"session/{session_name}.json"):
         with open(f"session/{session_name}.json","r",encoding="utf-8") as f:
             session_date=json.load(f)
             st.session_state.current_session=session_name
             st.session_state.nick_name = session_date["nick_name"]
             st.session_state.character = session_date["character"]
             st.session_state.messages = session_date["messages"]
    except Exception as e:
        st.error("加载会话失败")

同时我补充一下 值一 if 条件 else 值二

复制代码
if st.button(session,icon="😃",type="primary" if session==st.session_state.current_session else "secondary"):

效果如下

删除会话:

复制代码
#删除会话信息的操作:
def delete_session(session_name):
    try:
        if os.path.exists(f"session/{session_name}.json"):
            os.remove(f"session/{session_name}.json") #删除文件
            if session_name==st.session_state.current_session:
                st.session_state.messages=[]
                st.session_state.current_session = generate_session_id()
    except Exception as e:
        st.error("删除会话失败")

删除之后我们就移除文件,同时需要注意的是我们删除的是否是我们点开的会话,如果是,那么消息清空,并且重建一个页面

相关推荐
许彰午3 分钟前
73_Python爬虫Scrapy框架入门
爬虫·python·scrapy
@realXuan8 分钟前
人工智能AI编程 Agent 入门系列教程之 Claude Code 是什么
人工智能·python·ai编程
孤狼warrior13 分钟前
从冒泡到传送带流水线:一个3D沉浸式算法靶场,让思想的伟力改变世界
python·算法·typescript
搬砖柯16 分钟前
系列11-测试平台 MCP Server 实践:用 Kimi Code 自然语言查项目、跑 API 回归
人工智能·python·ai·开源·自动化
向阳是我17 分钟前
在 Mac(M2)上用 faster-whisper 实现高精度中文语音转文字
python·macos·ai·whisper·语音识别
山海云端有限公司21 分钟前
企业工商信息查询API实战:从认证到数据解析全流程
python·api·数据解析·企业信息查询·聚合api·第三方集成
大圣编程26 分钟前
python break语句
开发语言·前端·python
迷路爸爸18027 分钟前
Python collections 入门+实战
windows·python·c#·collections·dict
AI-好学者36 分钟前
MCP企业运用全面知识点-基础篇
服务器·开发语言·网络·人工智能·python·架构
Sam092744 分钟前
【AI 算法精讲 13】朴素贝叶斯:文本分类的基石
人工智能·python·算法·ai