如何在Python中存储变量/首选项以供以后使用

时间:2012-05-17 22:08:23

标签: python registry preferences persistent

我正在使用Python for Windows的程序,并希望保存变量和用户首选项,以便即使在程序终止并重新启动后我也可以调用它们。

在Windows机器上有理想的方法吗? _winreg和Windows注册表是否适合此任务?或者我是否需要创建自己的某种数据库?

8 个答案:

答案 0 :(得分:7)

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上,你也应该知道注册表是一个可怜的scum和villainy蜂巢,并且你不应该用它来存储你的python app配置。

答案 1 :(得分:4)

除非我遗漏了某些内容,否则正则表达式与Windows注册表无关。只需将配置文件存储在某处,比如用户的主目录或其他任何内容。至少这是我在linux上所做的。在某处存储文件在~/.config/

答案 2 :(得分:4)

您通常希望将其存储在“home”文件夹的配置文件夹中。这在* 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("~"))

拥有homedirectory后,您应该创建一个以项目命名的文件夹:

if not os.path.isdir("{0}.{1}".format(homedir,projectname)):
    os.mkdir("{0}.{1}".format(homedir,projectname))

然后你可以在该文件夹中创建一个配置文件,并以你选择的格式(我个人最喜欢的XML格式)为你编写选项。

答案 3 :(得分:1)

如果您只想存储键值对的首选项,请在文本配置文件中进行。如果要存储python结构,请使用pickleshelve执行此操作。如果您需要轻松,轻松,rdbms使用sqlite

答案 4 :(得分:1)

虽然pickle模块是一个显而易见的选择,但它所写的文件将是非人类可读的。对于配置文件,如果您的配置文件是用户可以阅读甚至编辑的简单文本格式,那将是一件好事。所以,我建议你使用JSON和json模块。

答案 5 :(得分:1)

有几种方法,分为两个主要方向

  • 使用_winreg模块访问Windows注册表。

使用注册表将设置转移到另一台机器或检查它们或备份它们是非常重要的;你必须使用regedit

另一种方法是将首选项存储在用户的“我的文档”文件夹中的文件中。这样可以更轻松地将设置移动到其他计算机或用户,并且不会将程序的设置与许多其他应用程序的设置混合在一起。所以像备份和恢复它们更容易;你只需复制一个文件。如果选择文本格式,则检查和调试设置也更容易。

  • 将您的设置放入列表,元组或字典中,并使用cPickle模块进行保存。这可能是最简单的方法之一。另一方面,虽然腌制数据默认使用ASCII格式,但它不是人类可读的。
  • 使用ConfigParser模块以与Windows .ini文件类似的结构保存和加载配置文件。这些文件是人类可读的。
  • 使用json模块以json格式存储设置。这些文件是人类可读的。
  • 将首选项保存为Python表达式到文本文件,并使用execfile()加载它。注:这可以用于执行任意代码,因此存在安全考虑因素。但从好的方面来说,它非常容易阅读。

答案 6 :(得分:0)

要保存变量,建议您使用pickle

答案 7 :(得分:0)

要确定首选项的存储位置,我建议使用 appdirs 包为您的操作系统定位适当的“应用程序数据”、“首选项”或“主”目录:< /p>

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 module 读取/写入该文件。

  • 嵌套字典、列表、字符串和整数?考虑 JSON,您可以使用内置的 json module 读/写。

  • 有更高级的需求?比如存储大量的偏好项,或者需要存储二进制数据?考虑一个使用内置 sqlite3 module 的 sqlite 数据库。

虽然可以使用 pickle 模块,但我不推荐它,因为配置文件不是人类可读的。