Python 中的配置文件





5.00/5 (8投票s)
在 Python 应用程序中创建配置文件;添加、更新和删除配置,以及读取配置
你真的需要配置文件吗?
如果一个开发者在他的项目中有一个模块,该模块连接到一个 FTP 服务器以下载一些文件,那么开发者会编写一个方法来通过 FTP URL 连接到 FTP,并使用用户名和密码等凭据以成功连接。如果开发者在代码中使用了这些凭据,并将它们硬编码在他们的代码文件中并部署了应用程序,这可能工作得很好,任务完成!现在,想象一下,两个月后,该 FTP 站点的密码已更改,开发者必须再次在你的应用程序中更新该密码,以确保现有 FTP 连接功能不会中断。在这种情况下,开发者将再次更改代码并重新部署。在这里,开发者必须为了一个小小的配置更改,获取最新的代码,进行必要的更改,确保没有其他地方出错,重新部署应用程序,然后进行测试。而且,当一些配置再次更改时,这可能是一项重复的任务,每隔 2-3 个月就会发生一次。如果应用程序有一个配置文件,其中包含键值对,如“用户”:“<用户名>”,“密码”:“密码”,并且每当需要更改时,只修改该文件并更新配置,而不是深入研究实际代码。
为什么选择配置文件?
来自 .NET 背景,我发现要弄清楚开发者如何在 Python 应用程序中拥有一个配置文件,可以用来读取设置值,而无需触碰代码来更新或保存设置,这有点挑战。配置文件用于存储键值对或一些可配置的信息,这些信息可以在代码中以及在某个时间点被读取或访问。如果该配置发生更改,开发者只需更改配置文件中的配置,而无需担心更改代码,因为这可能需要重新编译代码并重新部署。不仅如此,使用配置文件还可以使你的设置和代码更具可重用性,并将设置信息保存在一个集中的位置并进行隔离。当然,像密码、密钥和证书这样的敏感信息应该更安全地存储,可能是在云存储库中。但是应用程序使用的基本设置可以包含在配置文件中。
Microsoft .NET 与 Python 配置文件
Microsoft .NET 应用程序在开始项目模板时,有时会默认提供 appSettings
、web.config、app.config 等文件,具体取决于你正在创建的应用程序类型。这些文件用于存储设置信息。
Python 应用程序默认不提供设置文件,但是你可以使用现有的并进行修改。但最好的方法是从头开始创建自己的文件并按需使用。
入门
在本文中,我们将逐步介绍如何在 Python 应用程序中创建配置文件、添加配置、更新配置、删除配置以及读取配置。
我们将使用 ConfigParser 模块来处理配置文件,并了解生成和读取配置文件有多么简单。Python 可以动态或定期地拥有包含应用程序所需的所有设置的配置文件。Python 配置文件使用 .ini 作为扩展名。
我们将使用 VS Code (Visual Studio Code) 创建一个主方法,该方法使用配置文件读取配置,然后将其打印到控制台。对于像我这样刚开始使用 Python 的开发者来说,这可能是非常新的,所以我们将从零开始。
先决条件
我不会详细介绍安装 Python 和配置 VS Code 来运行 Python 应用程序,我假设你已经安装好了。如果没有,我可以根据请求发布一篇关于如何在 VS Code 中开始使用 Python 的独立文章。
创建配置文件
启动 VS Code 并创建一个 main.py 文件
打开 VS Code 并创建一个新文件,将其命名为 main.py。
从硬编码开始
编写一小段代码来读取硬编码的值并打印它们。为了开始并为了理解,我首先使用硬编码的值来打印,然后稍后将从配置文件中获取它们。
ftpUrl = "demoftp.codeteddy.com"
userName = "codeteddy"
password = "my#supersecret#password"
print("\nDisplaying FTP details\n")
print("FTP URL: " + ftpUrl)
print("FTP User Name: " + userName)
print("Password: " + password)
运行代码
现在运行代码以打印详细信息。在角落,应该有一个运行代码并显示输出到终端的图标。
所以,输出是
Displaying FTP details
FTP URL: demoftp.codeteddy.com
FTP User Name: codeteddy
Password: my#supersecret#password
PS D:\Articles\Python_ConfigFile\Code>
我们的目标是确保输出保持不变,但 FTP 设置的值是从配置文件中读取的。
生成配置文件的代码
在 VS Code 中,创建一个名为 generate_config.py 的新文件,并导入 configparser
模块,如下所示
import configparser
现在将以下代码放入文件中
import configparser
# CREATE OBJECT
config_file = configparser.ConfigParser()
# ADD SECTION
config_file.add_section("FTPSettings")
# ADD SETTINGS TO SECTION
config_file.set("FTPSettings", "ftpUrl", "demoftp.codeteddy.com")
config_file.set("FTPSettings", "userName", "codeteddy")
config_file.set("FTPSettings", "password", "my#supersecret#password")
# SAVE CONFIG FILE
with open(r"configurations.ini", 'w') as configfileObj:
config_file.write(configfileObj)
configfileObj.flush()
configfileObj.close()
print("Config file 'configurations.ini' created")
# PRINT FILE CONTENT
read_file = open("configurations.ini", "r")
content = read_file.read()
print("Content of the config file are:\n")
print(content)
read_file.flush()
read_file.close()
因此,我们导入 configparser
模块,其中包含可用于定义我们所需的配置文件布局的方法和类。我们创建一个 Configparser
对象,并将其命名为 config_file。配置文件可以包含分段,其中存储详细信息,例如 FTP 设置或日志记录器设置等。因此,我们创建了一个名为“FTPSettings
”的分段,并通过 config_file.set
方法向该分段添加了键值对,该方法接受第一个参数作为分段名称,第二个作为键,第三个作为值。在我们的例子中,分段名称是“FTPSettings
”,三个键是 ftpUrl
、userName
和 password
。
然后,我们将定义的布局保存到一个名为 configurations.ini 的 ini 文件中。你可以选择你喜欢的任何文件名来保存设置。然后最后,我们检索已保存 ini 文件的内容,并在终端窗口或控制台中打印它们。
保存此文件并运行后,它将生成一个 configurations.ini 文件。
生成的 XML 文件
如果我们打开 configurations.ini 文件,即新生成的 XML 文件,我们会看到以下设置
[FTPSettings]
ftpurl = demoftp.codeteddy.com
username = codeteddy
password = my#supersecret#password
它包含了 FTPSettings
分段以及我们作为其下的键值对的 FTP 设置。每次运行 generate_config
的代码时,它都会创建一个新的配置文件,其布局与代码文件中定义的相同。
让我们向文件添加一个分段。但这次,我们将以不同的方式添加。例如,如果我们想为 Logger
及其相应的设置添加一个分段,我们也可以使用以下代码在一个代码语句中完成此操作
# ADD NEW SECTION AND SETTINGS
config_file["Logger"]={
"LogFilePath":"<Path to log file>",
"LogFileName" : "<Name of log file>",
"LogLevel" : "Info"
}
现在,generate_config.py 文件如下所示,并添加了新分段
import configparser
# CREATE OBJECT
config_file = configparser.ConfigParser()
# ADD FTPSettings SECTION
config_file.add_section("FTPSettings")
# ADD SETTINGS TO FTPSettings SECTION
config_file.set("FTPSettings", "ftpUrl", "demoftp.codeteddy.com")
config_file.set("FTPSettings", "userName", "codeteddy")
config_file.set("FTPSettings", "password", "my#supersecret#password")
# ADD NEW SECTION AND SETTINGS
config_file["Logger"]={
"LogFilePath":"<Path to log file>",
"LogFileName" : "<Name of log file>",
"LogLevel" : "Info"
}
# SAVE CONFIG FILE
with open(r"configurations.ini", 'w') as configfileObj:
config_file.write(configfileObj)
configfileObj.flush()
configfileObj.close()
print("Config file 'configurations.ini' created")
# PRINT FILE CONTENT
read_file = open("configurations.ini", "r")
content = read_file.read()
print("Content of the config file are:\n")
print(content)
read_file.flush()
read_file.close()
当我们运行代码时,我们看到我们的 config 文件已更新,包含这些新详细信息
[FTPSettings]
ftpurl = demoftp.codeteddy.com
username = codeteddy
password = my#supersecret#password
[Logger]
logfilepath = <Path to log file>
logfilename = <Name of log file>
loglevel = Info
因此,我们可以使用这两种方法,即 add_section()
和 set
方法,或者对象初始化器方式来创建分段并向其添加设置。
添加/更新/删除配置文件设置
我们也可以通过代码来添加、更新或删除配置文件中的设置。
在配置文件中添加/更新设置
例如,如果我们想将“loglevel
”从“Info
”更新为“Debug
”,或者想向 Logger
分段添加一个新设置。你可以更新同一个 generate_config.py 文件中的设置并运行它,或者你可以编写代码来读取现有配置文件并更新新设置。例如,我创建了一个名为 update_config.py 的新 Python 文件,并向其中添加了以下代码
import configparser
# CREATE OBJECT
config_file = configparser.ConfigParser()
# READ CONFIG FILE
config_file.read("configurations.ini")
# UPDATE A FIELD VALUE
config_file["Logger"]["LogLevel"]="Debug"
# ADD A NEW FIELD UNDER A SECTION
config_file["Logger"].update({"Format":"(message)"})
# SAVE THE SETTINGS TO THE FILE
with open("configurations.ini","w") as file_object:
config_file.write(file_object)
# DISPLAY UPDATED SAVED SETTINGS
print("Config file 'configurations.ini' is updated")
print("Updated file settings are:\n")
file=open("configurations.ini","r")
settings=file.read()
print(settings)
在此代码中,我们首先导入,然后创建 configparser
对象。我们读取现有配置文件,然后将 Logger
分段中的 LogLevel
设置为“Debug
”。同样,我们通过 update
方法通过此代码在 Logger
分段下添加了一个新设置
config_file["Logger"].update({"Format":"(message)"})
此代码在 Logger
分段下添加了一个名为“Format
”的新设置,其值为“(message)
”。最后,我们再次保存文件,然后再次读取它以显示已保存的信息。
现在当你运行代码时,输出是
Config file 'configurations.ini' is updated
Updated file settings are:
[FTPSettings]
ftpurl = demoftp.codeteddy.com
username = codeteddy
password = my#supersecret#password
[Logger]
logfilepath = <Path to log file>
logfilename = <Name of log file>
loglevel = Debug
format = (message)
因此,这些是你更新 ini 文件的方法。
删除设置
我们可以使用 configparser
模块中的 remove_option()
和 remove_section()
来从配置文件中删除设置。remove_option()
用于删除任何分段中的一个字段(即键值对),而 remove_section()
用于删除配置文件的整个分段。
# DELETE A FIELD IN THE SECTION
config_file.remove_option('Logger', 'Format')
# DELETE A SECTION
config_file.remove_section('Logger')
在 Python 中读取配置文件
现在文件已经创建,并且我们已经学会了如何在需要时生成和更新配置文件。让我们访问本文的最后一个部分,即在我们的主类中读取配置文件中的值。这是最简单直接的部分。
让我们使其更有条理和可重用。我们在 VS Code 工作区中添加一个辅助文件,并将其命名为 helper.py,然后将以下代码添加到其中
import configparser
# Method to read config file settings
def read_config():
config = configparser.ConfigParser()
config.read('configurations.ini')
return config
现在,这段辅助方法代码将在我们需要配置的任何地方作为可重用方法。
现在,转到 main.py 文件并像这样导入此辅助文件
现在,在 main.py 中,用从 config 文件读取设置来替换硬编码的部分,如下所示
import helper
config = helper.read_config()
ftpUrl = config['FTPSettings']['ftpUrl']
userName = config['FTPSettings']['userName']
password = config['FTPSettings']['password']
print("\nDisplaying FTP details\n")
print("FTP URL: " + ftpUrl)
print("FTP User Name: " + userName)
print("Password: " + password)
然后运行代码。我们将看到我们的输出与它从硬编码代码读取值时相同。
现在它从配置文件读取。
历史
- 2021 年 12 月 9 日:初始版本