常用配置文件-ini文件
ini格式的文件由多个部分组成,每个部分都由一个[section]
标题开头,然后由特定的字符串(=
或者:
, 默认是=
)分割的键/值条目。默认情况下,[section]
的名称是区分大小写的,而后面键是不区分大小写的。前面和后面的空格,将会从键和值中删除。配置文件中也可能包含注释部分,由特定字符(#
或者;
,默认是#
)界定,值得注意的是,注释部分不可与键值处于同一行。值也是可以跨多行的,只要值在换行时,缩进的深度比第一行的要深就行!
ini格式文件的基本格式如下:
[section1]
key1 = value1
key2 = value2
....
Python本身内置的configparser
标准库可以很轻松的读取和写入此类文件。
写入文件
下面,我们使用configparser
库来将一些配置写入到.ini
格式文件当中:
from configparser import ConfigParserparser = ConfigParser()
parser['default'] = {'host': '0.0.0.0','port': 6000,'duration': 1.3,'debug': False
}
parser['testing'] = {'host': '127.0.0.1','port': 6001,'duration': 1.3,'debug': True
}
with open('settings.ini', 'w') as f:parser.write(f)
执行完毕之后,正常情况下,会在当前目录之下生成一个名为settings.ini
的文件,内容如下:
[default]
host = 0.0.0.0
port = 6000
duration = 1.3
debug = False[testing]
host = 127.0.0.1
port = 6001
duration = 1.3
debug = True
读取文件
上面,我们已经创建并保存了一个.ini
文件,下面我们来读取它:
from configparser import ConfigParserparser = ConfigParser()
parser.read('settings.ini')
sections = parser.sections()
print(type(sections), sections) # <class 'list'> ['default', 'testing']
print('default' in sections) # True
print('fff' in sections) # False
topsecret = parser['default']
print(type(topsecret), topsecret) # <class 'configparser.SectionProxy'> <Section: default>
print(topsecret.get('host'), topsecret.get('d')) # 0.0.0.0 None
print(type(parser.items('default')), parser.items('default')) # <class 'list'> [('host', '0.0.0.0'), ('port', '6000')]
print(dict(parser.items('default'))) # <class 'list'> [('host', '0.0.0.0'), ('port', '6000')]
print(type(parser.get('default', 'host')), parser.get('default', 'host')) # <class 'str'> 0.0.0.0
print(type(parser['default']['host']), parser['default']['host']) # <class 'str'> 0.0.0.0
类型转换
configparser
默认将值以字符串的形式呈现,所以这就是为什么我们在settings.ini
文件中没有加引号,而是将字面值直接写在上面!配置解析器不会去猜测配置文件中值的数据类型,而总是将他们内部存储为字符串,这意味着,如果需要其他数据类型,则应自行转换。如下:
port = int(topsecret['port'])
print(type(port), port) # <class 'int'> 6000
由于此种操作非常常见,因此配置解析器提供了一系列方便的getter
方法来处理整数,浮点数和布尔值。
debug = topsecret.getboolean('debug')
print(type(debug), debug) # <class 'bool'> False
port = parser['default'].getint('port')
print(type(port), port) # <class 'int'> 6000
f = parser['default'].getfloat('duration')
print(type(f), f) # <class 'float'> 1.3
debug = parser.getboolean('default', 'debug')
print(type(debug), debug) # <class 'bool'> False
值得注意的是,getboolean()
方法将值进行转换时不区分大小写,即"TRUE"/“FALSE”, “True”/“False”, “yes”/“no”, “on”/“off”, “1”/"0"都能识别为bool值
默认值
与字典一样,我们可以使用get()
方法提供默认值:
a = topsecret.get('a')
print(a) # None
a = topsecret.get('a', 'sb')
print(a) # sb
值得注意的是,解析器级别的get()
方法同样可以使用默认值,解析器级别的get()
方法可以使用fallback
关键字参数提供默认值,如下:
# 当default块不存在,或者AAA键不存在,或者都不存在,将返回默认值
a = parser.get('default', 'AAA', fallback='sb')
print(a) # sb
上面的几个类型转换方法,同样可以使用fallback
关键字参数来提供默认值,如下:
debug = topsecret.getboolean('AAA', fallback=False)
print(type(debug), debug) # <class 'bool'> False
port = parser['default'].getint('ppp', fallback=404)
print(type(port), port) # <class 'int'> 404
值插值
出了核心功能之外,configparser
还支持插值,这意味着可以对值进行预处理,然后再从get()
中调用他们。configparser
支持的插值方式由两种:
%(key)s
[default]
resource=/home/xiaoming/resource
image_folder=%(resource)s/image
如此,我们获取到"image_folder"对应的值将会是"home/xiaoming/resource/image"
${section:option}
[default]
resource=/home/xiaoming/resource
image_folder=${resource}/image[testing]
image_folder=${default:resource}/testing
可以看到${section:option}
即可以从当前块中引用插值,也可以从其他块中进行引用插值
API详解
ConfigParser(defaults=None, dict_type=_default_dict, allow_no_value=False, , delimiters=(’=’, ‘:’), comment_prefixes=(’#’, ‘;’), inline_comment_prefixes=None, strict=True, empty_lines_in_values=True, default_section=DEFAULTSECT, interpolation=_UNSET, converters=_UNSET)
defaults
: 此选项接收键值对的字典,该字典将首先放在该DEFAULT
块上。如果defaults
有值,那么读写豆浆包含该块的内容,并且该块名称大小写敏感,默认值: Nonedict_type
: 此选项对映射协议的行为以及写入的配置文件的外观有重大影响,通常不需要修改,默认值:dictallow_no_value
: 某些文件中包含没有值的键,allow_no_value配置可用于指示是否应接受此类值
config_str = """
[mysql]
host=127.0.0.1
port=3306
name=ini
user=root
password=123456
db
"""
parser = ConfigParser()
parser.read_string(config_str) # configparser.ParsingError: Source contains parsing errors: '<string>'parser = ConfigParser(allow_no_value=True)
parser.read_string(config_str)
print(parser['mysql']['db']) # None
delimiters
: 键值对分隔符,默认值:(’=’, ‘:’)comment_prefixes
: 行下注释前缀符号,默认值:(’#’, ‘;’)inline_comment_prefixes
: 行内注释前缀符号,不建议使用,默认值: Nonestrict
: 应该设置为True,解析器不允许从单个源读取任何节或选项的重复empty_lines_in_values
: 空行是否包含在值中,默认值:Truedefault_section
: 默认块的名称,默认值:DEFAULTinterpolation
: 插值器,默认值:configparser.BasicInterpolationconverters
: 转换器,默认值:not set
常用方法
defaults()
: 返回包含实例范围值的字典
parser = ConfigParser(defaults={'testing': True}, allow_no_value=True)
parser.read_string("""
[mysql]
host=127.0.0.1
port=3306
name=ini
user=root
password=123456
db
""")
d = parser.sections()
print(type(d), d) # <class 'collections.OrderedDict'> OrderedDict([('testing', 'True')])
sections()
: 返回可用的块名称列表,默认的部分不包括在列表中
s = parser.sections()
print(type(s), s) # <class 'list'> ['mysql']
add_section(section)
: 将传递过来的块名称添加到实例。如果给定的名称已经在实例中存在,则会引发DuplicateSectionError
错误;如果传递了DEFAULT
,则会引发ValueError
错误
parser.add_section('server')
has_section(section)
: 判断实例是否包含指定块,返回一个bool值
b = parser.has_section('server')
print(type(b), b) # <class 'bool'> False
options(section)
: 返回指定块的键名列表,返回一个list对象
l = parser.options('mysql')
print(type(l), l) # <class 'list'> ['host', 'port', 'name', 'user', 'password', 'db', 'testing']
has_option(section, option)
: 判断指定块中是否包含指定的键,返回一个bool值
b = parser.has_option('mysql', 'name')
print(type(b), b) # <class 'bool'> True
read(filenames,encoding=None)
: 从指定文件路径读取read_file(f, source=None)
: 从文件句柄中读取read_string(string, source='<string>')
: 从字符串中读取read_dict(dictionary, source='<dict>')
: 从字典中读取get(section, option, *, raw=False, vars=None, fallback=_UNSET)
: 获取指定块,指定键的值。参数raw,vars和fallback仅作为关键字,以防止用户尝试将第三个参数用作
value = parser.get('mysql', 'host')
print(type(value), value) # <class 'str'> 127.0.0.1
getint(section, option, *, raw=False, vars=None, fallback=_UNSET)
: 获取指定块,指定键的值,并将其转换为int类型getfloat(section, option, *, raw=False, vars=None, fallback=_UNSET)
: 获取指定块,指定键的值,并将其转换为float类型getboolean(section, option, *, raw=False, vars=None, fallback=_UNSET)
: 获取指定块,指定键的值,并将其转换为bool类型items(section, raw=False,vars=None)
: 获取指定块的数据,返回一个list
items = parser.items('mysql')
print(type(items), items) # <class 'list'> [('testing', 'True'), ('host', '127.0.0.1'), ('port', '3306'), ('name', 'ini'), ('user', 'root'), ('password', '123456'), ('db', '')]
set(section, option, value)
: 将指定块、指定键修改为指定的值write(fileobject,space_around_delimiters=True)
: 将内容写入到文件对象中。"space_around_delimiters"设置控制是否需要在键值对分隔符将空格remove_option(section, option)
: 将指定块中的指定键移除remove_section(section)
: 将指定块移除
更多configparser
的使用,请看: https://docs.python.org/3/library/configparser.html#customizing-parser-behaviour
自此Over~~~
常用配置文件-ini文件相关推荐
- 常用配置文件-toml文件
toml的目标是成为一种最小的配置文件格式,由于明显的语义,该格式易于阅读.toml旨在明确的映射到哈希表.toml应该易于解析解析为多重语言的数据结构. .toml文件的基本格式如下: [defau ...
- Python常用配置文件ini、json、yaml读写总结
开发项目时,为了维护一些经常需要变更的数据,比如数据库的连接信息.请求的url.测试数据等,需要将这些数据写入配置文件,将数据和代码分离,只需要修改配置文件的参数,就可以快速完成环境的切换或者测试数据 ...
- Python常用配置文件ini、json、yaml及python字典读写总结
文章目录 1.ini格式 1.1 ini的读取删除操作 1.2 ini 写入操作 2.JSON格式 2.1 JSON示例格式 3. yaml格式 3.1 yaml的语法特点 3.2 yaml示例 3. ...
- 利用GetPrivateProfileString读取配置文件(.ini)
配置文件中经常用到ini文件,在VC中其函数分别为: 写入.ini文件:bool WritePrivateProfileString(LPCTSTR lpAppName,LPCTSTR lpKeyNa ...
- VC操作INI文件 ,INI文件操作总结,如何操作INI文件,INI文件使用方法小结
INI文件简介 在我们写程序时,总有一些配置信息需要保存下来,以便在下一次启动程序完成初始化,这实际上是一种类持久化.将一些信息写入INI文件(initialization file)中,可完成简单的 ...
- C++,ini文件操作(包含类)
什么是ini文件? initialization File,即为初始化文件,是windows的系统配置文件所采用的存储格式,统管windows的各项配置.或者作为项目中的配置文件,为整个项目所共用. ...
- MFC操作ini文件方法
转载:https://blog.csdn.net/rayborn1105/article/details/8192142 在我们的程序设计中经常需要对一些参数进行配置,配置好后还要在下一次启动仍然有效 ...
- c读取ini配置文件_Go-INI - 超赞的Go语言INI文件操作库
INI 文件(Initialization File)是十分常用的配置文件格式,其由节(section).键(key)和值(value)组成,编写方便,表达性强,并能实现基本的配置分组功能,被各类软件 ...
- python3读取ini文件_python3配置文件ini读取方法
1.最常用的Plain text形式的配置文件 1.1首选 .init 文件 标准库 configparser 1.2次选 csv文件 与 Unix/Linux 下常用的 xx = xxx形式的配置文 ...
最新文章
- 不再写死,SpringBoot实现动态增删启停定时任务
- URL 去重的 6 种方案!(附详细代码)
- Android开发环境的搭建
- 最古老的100个.com域名
- mysql 表分区 django_MySQL partition分区I
- php基础知识(六)
- Jquery赋值和取值input,combobox,numberbox........
- 【Linux】库文件
- aspnet网站开发实例_给自己开发一个网站,这是我的方法。
- python自动化办公能做什么-用Python自动办公,做职场高手(完结)
- 表达式求值详解(C++)
- 单例模式之懒汉式(三种代码实现)
- 计算机应用技术头像,意大利科学家应用计算机技术进行头像复原
- java 调用微信JsApi支付
- 礼金记账本安卓_礼金记账本
- kali Linux的简单介绍
- 手工皮具的大坑之路-封边感悟与工具
- Typora一款让你无法拒绝的MarkDown编辑器
- 面向未来,镭速助力企业构建文件安全外发新生态
- Android 内存被异常回收后直接重启APP
热门文章
- Win32汇编学习(10):对话框(1)
- SolidWorks二次开发语法技巧及基础
- 基于ThinkPHP3.2.3的微信OAuth2.0微信网页授权
- 开启合同签署新方式!百度超级链推出区块链智能签约服务
- SpringBoot整合篇-雷丰阳-专题视频课程
- 鼠标工具绘制(电子围栏,矢量图形,矢量编辑) 高德地图
- Tutorial教程:知错就改,错了就罚,论训练深度学习如何选择损失函数
- Jaspersoft报no markup processor factory specified for markup
- 在notepad++每行首尾添加字符
- 1145. Hashing - Average Search Time (25)