Python3中PyQt5应用存储加载临时输入数据的最佳实践是什么
针对你的场景的最佳实践方案
首先明确一个误区:你用到的tempfile模块生成的临时文件会在关闭后自动删除,完全不适合存储需要跨应用启动周期保留的用户历史输入,不要用这个方案。
最优适配方案:直接用PyQt5内置的QSettings
你本身就在用PyQt5开发,Qt框架自带的QSettings是为GUI应用存储配置、用户历史输入设计的原生方案,不需要额外安装依赖,自动适配跨平台的存储路径(Windows存在注册表,macOS存在plist配置文件,Linux存在~/.config目录),不需要你手动创建文件夹、处理路径,天然支持结构化键值对存储:
from PyQt5.QtCore import QSettings # 初始化,一般填你的组织名和应用名即可,自动处理存储路径 settings = QSettings("MyOrg", "MyApp") # 存储数据 settings.setValue("edit_line_1", "temp data 1") settings.setValue("edit_line_2", "temp data 2") settings.setValue("edit_line_3", "temp data 3") # 读取数据,第二个参数是找不到对应键时的默认值 edit_line_1_val = settings.value("edit_line_1", "") edit_line_2_val = settings.value("edit_line_2", "") # 如果需要点属性访问的形式,可以配合标准库的SimpleNamespace from types import SimpleNamespace tmp_data = SimpleNamespace( edit_line_1 = settings.value("edit_line_1", ""), edit_line_2 = settings.value("edit_line_2", ""), edit_line_3 = settings.value("edit_line_3", "") ) # 直接用 tmp_data.edit_line_1 访问即可
无第三方依赖的通用方案:用标准库shelve模块
如果你需要和PyQt解耦的通用存储方案,Python标准库自带的shelve是类字典的持久化存储模块,不需要自己做序列化、反序列化的字符串处理,直接操作键值对即可:
import shelve from types import SimpleNamespace # 存储数据,自动生成持久化文件 with shelve.open("./user_input_history") as db: db["edit_line_1"] = "temp data 1" db["edit_line_2"] = "temp data 2" db["edit_line_3"] = "temp data 3" # 读取数据 with shelve.open("./user_input_history") as db: # 转成点属性访问的形式 tmp_data = SimpleNamespace(**db) print(tmp_data.edit_line_1) # 输出 temp data 1
如果你偏好YAML格式的方案
需要先安装pyyaml依赖,加载后转成SimpleNamespace即可实现点属性访问:
import yaml from types import SimpleNamespace # 存储 data = { "edit_line_1": "temp data 1", "edit_line_2": "temp data 2", "edit_line_3": "temp data 3" } with open("config.yaml", "w", encoding="utf-8") as f: yaml.dump(data, f, allow_unicode=True) # 读取 with open("config.yaml", "r", encoding="utf-8") as f: data = yaml.safe_load(f) tmp_data = SimpleNamespace(**data) print(tmp_data.edit_line_1) # 输出 temp data 1
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

