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("删除会话失败")

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

相关推荐
deephub1 小时前
构建生产级 AI Agent 系统的4大主流技术:反思、工具、规划与多智能体协作
人工智能·python·深度学习·大语言模型·agent
weixin_462901972 小时前
在嵌入式设备(ESP32)上构建一套 “局域网内可视化、跨设备兼容” 的硬件控制方案,
python
I love studying!!!2 小时前
python项目: 下载数据
开发语言·python
不只会拍照的程序猿2 小时前
《嵌入式AI筑基笔记03:Python流程控制,从C的严谨到Python的简洁》
c语言·开发语言·笔记·python
漫随流水2 小时前
旅游推荐系统(getEchartsData.py)
python·django·旅游
宸津-代码粉碎机2 小时前
SpringBoot 任务执行链路追踪实战:TraceID 透传全解析,实现从调度到执行的全链路可观测
开发语言·人工智能·spring boot·后端·python
veminhe2 小时前
Python编写isprime() 函数,参数为整数,要有异常处理。函数功能是如果整数是质数,返回True ,否则返回False。
python
Bert.Cai2 小时前
Python flush函数作用
开发语言·python