
感觉还是这样写看起来舒服点。。。

在任何大型应用中,配置文件是必不可少的一部分。它们提供了一种方法来管理应用程序设置,而无需直接修改代码。Python为处理这些配置文件提供了一个内置库,名为ConfigParser。
ConfigParser模块在Python中用于处理配置文件。它具有一个类RawConfigParser和它的两个子类ConfigParser和SafeConfigParser,用于读取和写入数据到INI格式的配置文件。
INI文件包含节(section),每个节下可以包含键-值对。以下是一个简单的例子:
[DEFAULT]
ServerAliveInterval = 45
Compression = yes
CompressionLevel = 9
ForwardX11 = yes
[bitbucket.org]
User = hg
[topsecret.server.com]
Port = 50022
ForwardX11 = no
在这个例子中,“DEFAULT”, “bitbucket.org”, 和 “topsecret.server.com” 是节,而其下面的 ServerAliveInterval, Compression 等是键,等号右边的是对应的值。
首先,我们需要导入ConfigParser模块,并创建一个ConfigParser对象。然后,我们可以使用read()函数来读取配置文件。
import configparser
config = configparser.ConfigParser()
config.read('example.ini')
要访问特定的节和键,我们可以像操作字典一样操作ConfigParser对象:
print(config['bitbucket.org']['User']) # 输出: hg
要打印INI配置文件的所有内容,可以遍历ConfigParser对象中的所有节和键。下面是一个例子:
(注意:config.sections()不包含[DEFAULT]节点,要单独打印)
import configparser
config = configparser.ConfigParser()
config.read('example.ini')
# Print DEFAULT section
print("[DEFAULT]")
for key in config['DEFAULT']:
print("{} = {}".format(key, config['DEFAULT'][key]))
for section in config.sections():
print("[{}]".format(section))
for key in config[section]:
print("{} = {}".format(key, config[section][key]))
在这个代码中,config.sections()返回一个包含所有节名的列表。然后我们遍历每一个节,并在循环内部,遍历每一个节的所有键。
这样就会按照原始的INI格式,将配置文件的所有内容打印出来。
[]读取要手动转换)在默认情况下,configparser用[]读取的所有数据都是字符串类型的。它并不直接区分数据类型。你需要手动将数据转换为需要的类型:
import configparser
config = configparser.ConfigParser()
config.read('example.ini')
# 获取到的值为字符串类型
str_value = config['section']['key']
# 转换为整数类型
int_value = int(config['section']['key'])
# 转换为浮点类型
float_value = float(config['section']['key'])
需要注意的是,这些转换可能会引发异常(如 ValueError),如果你不能保证配置文件中的数据总能成功转换为你期望的类型,那么在进行转换时最好捕获并处理这些异常。
但是,configparser也提供了一些方法来直接读取并转换成相应类型:
例如:
import configparser
config = configparser.ConfigParser()
config.read('example.ini')
# 读取出来的都是字符串
str_value = config.get('section', 'key')
# 如果你知道它应该是整数,可以使用getint方法
int_value = config.getint('section', 'key')
# 对于布尔值,可以使用getboolean方法
bool_value = config.getboolean('section', 'key')
# 对于浮点数,可以使用getfloat方法
float_value = config.getfloat('section', 'key')
在这个例子中,getint(), getboolean() 和 getfloat() 方法会自动将字符串转换为对应的数据类型。如果转换失败,会抛出异常。
请注意,你需要确保在配置文件中的数据能够成功转换为对应的数据类型。例如,如果你尝试用 getint() 从一串非数字字符中获取数据,会导致错误。
我们可以通过简单地赋值来更改或添加节、键和值。
config['bitbucket.org']['User'] = 'different_user'
with open('example.ini', 'w') as configfile:
config.write(configfile)
这将修改 “bitbucket.org” 节中的 “User” 键的值,并将结果写回 “example.ini” 文件。
与字典类似,我们可以使用del语句删除配置文件中的键或节:
del config['topsecret.server.com']
with open('example.ini', 'w') as configfile:
config.write(configfile)
默认情况下,ConfigParser将所有键和节名转换为小写。如果需要保持原样,可以在创建ConfigParser对象时传递一个参数。
config = configparser.ConfigParser(allow_no_value=True)
INI文件可能包含没有值的键。要使ConfigParser接受这些键,我们可以在创建ConfigParser对象时传递一个参数。
config = configparser.ConfigParser(allow_no_value=True)
有时候,你可能会遇到一些含有特殊字符的键名。为了处理这种情况,我们可以使用Optionxform函数来自定义键的格式。
def my_optionxform(option):
return option
config = configparser.ConfigParser()
config.optionxform = my_optionxform
如果定义的值末尾带有空格,可以在 .ini 文件中使用引号将这个值包围起来。例如:
[section]
key = "value "
这样 configparser 在解析时就能够正确地识别出末尾的空格。然而,需要注意的是,在读取这个值时,configparser 会保留引号内的所有内容,包括首尾的空格。
import configparser
config = configparser.ConfigParser()
config.read('example.ini')
# 获取到的值为 "value ",末尾的空格被保留了下来
value = config.get('section', 'key')
如果不希望保留这些空格,可以在获取到值后手动去除它们:
# 去除首尾的空格
value = value.strip()
INI文件是一种简单的数据格式,它将配置数据存储为纯文本,并使用节和键-值对进行组织。以下是关于INI文件节点字段(即节和键)命名规范的一些常见指导原则。
有意义的名称:每个节的名称应清楚地反映该节中包含的配置信息。例如,如果一个节包含数据库设置,那么可以命名为 [database]。
独特性:每个节的名称都应该是唯一的。尽管大多数解析器在遇到重复的节名称时会合并内容,但这可能会引起混淆或不可预测的行为。
避免特殊字符:虽然大多数解析器都可以处理包含空格、下划线、破折号和其他非字母数字字符的节名,但最好避免使用它们,以确保与所有解析器的兼容性。
描述性:键的名称应详细且具有描述性,让读者能立即理解其用途。例如,username 或 password。
大小写敏感性:INI文件通常不区分键名的大小写,但某些解析器可能会。因此,建议始终使用一致的大小写规则。
避免空格和特殊字符:尽管大多数解析器都可以处理包含空格和其他非字母数字字符的键名,但为了确保与所有解析器的兼容性,最好避免使用它们。
不要重复:虽然有些解析器允许在同一个节中定义多个相同的键,但这可能导致混淆和不可预测的行为。因此,每个节中的键应该是唯一的。
清晰和简洁的命名对于确保配置文件的可读性和可维护性至关重要。
在INI配置文件中,DEFAULT节有一些特殊的属性。在ConfigParser模块中,DEFAULT节提供了一种设置和获取默认值的方法。
以下是关于DEFAULT节特殊性的几个关键点:
全局可用:在ConfigParser中定义的DEFAULT节中的键-值对可以在配置文件的任何地方使用。也就是说,DEFAULT节中的值可以被看作是全局变量,可以在配置文件的其他节中使用。
默认值:如果某个键在当前的节中没有找到,那么ConfigParser会查找DEFAULT节是否有这个键。如果DEFAULT节中有这个键,那么它的值就会被用作默认值。
覆盖:虽然DEFAULT节中的值可以在其他节中作为默认值,但是如果其他节中有与DEFAULT节中相同的键,那么该节中的值将覆盖DEFAULT节中的值。
例如,考虑下面的配置文件:
[DEFAULT]
debug = false
[server]
port = 8080
在这个例子中,如果我们尝试获取debug键在server节中的值,虽然在server节中并没有定义debug键,但ConfigParser会返回DEFAULT节中的值,即false。
import configparser
config = configparser.ConfigParser()
config.read('example.ini')
print(config['server']['debug']) # 输出: false
这就是Python中DEFAULT节的特殊性。可以看到,通过使用DEFAULT节,我们可以在整个配置文件中定义一组通用的默认值,从而使配置更加灵活和方便。
Python中的ConfigParser模块使用sections()方法来获取配置文件中所有的节。然而,这个方法返回的列表并不包含DEFAULT节。这是因为在设计上,DEFAULT节被认为是特殊的,并且其值对所有其他节都是可用的。
尽管DEFAULT节不在sections()方法返回的列表中,但我们仍然可以像访问字典一样访问它。例如,config['DEFAULT']会返回一个包含DEFAULT节所有键-值对的字典。
例如,考虑下面的代码:
import configparser
config = configparser.ConfigParser()
config.read('example.ini')
print(config.sections()) # 输出: ['server']
print(config['DEFAULT']) # 输出:
在这个例子中,虽然sections()方法没有返回DEFAULT,但我们仍然可以直接访问它。这是因为在ConfigParser的设计中,DEFAULT节被视为特殊的全局默认值提供者,而不是常规的节。
Python的ConfigParser模块为我们处理配置文件提供了方便。它可以用来读取、修改和写入INI格式的配置文件,使得管理应用程序设置变得更加容易。
参考资料: