我正在为 Windows 编写一个 Python 程序,并希望保存变量和用户首选项,以便即使在程序终止并重新启动后我也可以调用它们。
在 Windows 机器上是否有理想的方法来执行此操作?_winreg
Windows 注册表是否适合此任务?还是我需要创建自己的某种数据库?
我正在为 Windows 编写一个 Python 程序,并希望保存变量和用户首选项,以便即使在程序终止并重新启动后我也可以调用它们。
在 Windows 机器上是否有理想的方法来执行此操作?_winreg
Windows 注册表是否适合此任务?还是我需要创建自己的某种数据库?
Python2 在 Python3中有ConfigParser,即 configparser:
import ConfigParser, os
config = ConfigParser.ConfigParser()
config.readfp(open('defaults.cfg'))
config.read(['site.cfg', os.path.expanduser('~/.myapp.cfg')])
即使在 Windows 上,您也应该知道注册表是一个卑鄙的人渣和恶棍的蜂巢,您不应该使用它来存储您的 python 应用程序配置。
您通常希望将其存储在“主”文件夹中的配置文件夹中。这在 *nix 系统上很容易,在 Windows 上更难,因为您实际上需要获取“应用程序数据”目录。这通常对我有用:
import os
if os.name != "posix":
from win32com.shell import shellcon, shell
homedir = "{}\\".format(shell.SHGetFolderPath(0, shellcon.CSIDL_APPDATA, 0, 0))
else:
homedir = "{}/".format(os.path.expanduser("~"))
拥有主目录后,您应该创建一个以您的项目命名的文件夹:
if not os.path.isdir("{0}.{1}".format(homedir,projectname)):
os.mkdir("{0}.{1}".format(homedir,projectname))
然后,您可以在该文件夹中创建一个配置文件,并以您选择的格式将您的选项写入其中(我个人最喜欢的是 XML)。
除非我遗漏了什么,否则正则表达式与 Windows 注册表无关。只需将配置文件存储在某处,例如用户的主目录或其他任何地方。至少这是我在 linux 上所做的。将文件存储在某处~/.config/
虽然该pickle
模块是一个显而易见的选择,但它写入的文件将是非人类可读的。对于配置文件,如果您的配置文件是您的用户可以阅读甚至编辑的简单文本格式,那就太好了。所以,我推荐你使用 JSON 和json
模块。
有几种方式,分为两个主要方向
_winreg
。使用注册表将设置传输到另一台机器或检查或备份它们是非常重要的;你必须使用regedit
那些。
另一种方式将首选项存储在用户“我的文档”文件夹中的文件中。这使得将设置移动到另一台机器或用户变得更加容易,并且不会将您的程序设置与许多其他应用程序的设置混合在一起。因此,备份和恢复它们之类的事情更容易;您只需复制一个文件。如果您选择文本格式,也更容易检查和调试设置。
cPickle
模块一起保存。这可能是最简单的方法之一。不利的一面是,虽然腌制数据默认使用 ASCII 格式,但它不是人类可读的。ConfigParser
模块以与 Windows 文件类似的结构保存和加载配置.ini
文件。这些文件是人类可读的。json
模块以 json 格式存储设置。这些文件是人类可读的。execfile()
. NB 这可以用来执行任意代码,所以有安全方面的考虑。但从好的方面来说,它非常简单易读。为了保存变量,我推荐使用pickle
要确定存储首选项的位置,我建议使用appdirs包为您的操作系统找到适当的“应用程序数据”、“首选项”或“主”目录:
from appdirs import user_data_dir
appname = "SuperApp"
appauthor = "Acme"
appdata_dirpath = user_data_dir(appname, appauthor)
# 'C:\\Users\\me\\AppData\\Local\\Acme\\SuperApp' on Windows
# '/Users/me/Library/Application Support/SuperApp' on macOS
# '/home/me/.local/share/SuperApp' on Linux
import os
os.makedirs(appdata_dirpath, exist_ok=True)
然后在该目录中,您可以编写一个文件,文件格式有许多不同的选项:
键值字符串?考虑一个 INI 文件,您可以使用内置configparser.ConfigParser
模块读取/写入该文件。
嵌套字典、列表、字符串和整数?考虑 JSON,您可以使用内置json
模块读取/写入它。
有更高级的需求?比如存储大量偏好项,或者需要存储二进制数据?考虑一个使用内置sqlite3
模块的 sqlite 数据库。
虽然可以使用该pickle
模块,但我不推荐它,因为配置文件不是人类可读的。