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

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

相关推荐
Draina2 小时前
CBC填充预言攻击-CBC Padding Oracle Crypto Attack
python·安全·web安全·网络安全·密码学·安全性测试
Angel Q.2 小时前
特征提取 | DINO 到 DINOv3
图像处理·python
不如语冰3 小时前
AI大模型入门-pytorch-张量2 tensor创建
python
NPE~3 小时前
[AI]Agent开发——ADK框架使用
人工智能·python·ai·教程·adk·agent开发
矮个史蒂芬3 小时前
统计verilog .v文件中output 的bit数
python
gwf2163 小时前
磨损均衡算法(Wear Leveling)——SSD如何让每块闪存“公平退休“?
运维·数据库·人工智能·python·嵌入式硬件·算法·智能硬件
爱吃提升4 小时前
python 分布式爬虫、爬虫合规与综合实战项目
分布式·爬虫·python
审小匠OpenCPAi4 小时前
银行流水核查怎么自动化?单边匹配、双向勾稽与图聚类异常检测的工程对比
java·前端·人工智能·python·审计
元Y亨H5 小时前
Pandas 解析 Excel 导致的内存溢出(MemoryError)
python·excel
金銀銅鐵5 小时前
[Python] 用 turtle 来绘制瑞典国旗
python