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有值,那么读写豆浆包含该块的内容,并且该块名称大小写敏感,默认值: None
  • dict_type: 此选项对映射协议的行为以及写入的配置文件的外观有重大影响,通常不需要修改,默认值:dict
  • allow_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: 行内注释前缀符号,不建议使用,默认值: None
  • strict: 应该设置为True,解析器不允许从单个源读取任何节或选项的重复
  • empty_lines_in_values: 空行是否包含在值中,默认值:True
  • default_section: 默认块的名称,默认值:DEFAULT
  • interpolation: 插值器,默认值:configparser.BasicInterpolation
  • converters: 转换器,默认值: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文件相关推荐

  1. 常用配置文件-toml文件

    toml的目标是成为一种最小的配置文件格式,由于明显的语义,该格式易于阅读.toml旨在明确的映射到哈希表.toml应该易于解析解析为多重语言的数据结构. .toml文件的基本格式如下: [defau ...

  2. Python常用配置文件ini、json、yaml读写总结

    开发项目时,为了维护一些经常需要变更的数据,比如数据库的连接信息.请求的url.测试数据等,需要将这些数据写入配置文件,将数据和代码分离,只需要修改配置文件的参数,就可以快速完成环境的切换或者测试数据 ...

  3. 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. ...

  4. 利用GetPrivateProfileString读取配置文件(.ini)

    配置文件中经常用到ini文件,在VC中其函数分别为: 写入.ini文件:bool WritePrivateProfileString(LPCTSTR lpAppName,LPCTSTR lpKeyNa ...

  5. VC操作INI文件 ,INI文件操作总结,如何操作INI文件,INI文件使用方法小结

    INI文件简介 在我们写程序时,总有一些配置信息需要保存下来,以便在下一次启动程序完成初始化,这实际上是一种类持久化.将一些信息写入INI文件(initialization file)中,可完成简单的 ...

  6. C++,ini文件操作(包含类)

    什么是ini文件? initialization File,即为初始化文件,是windows的系统配置文件所采用的存储格式,统管windows的各项配置.或者作为项目中的配置文件,为整个项目所共用. ...

  7. MFC操作ini文件方法

    转载:https://blog.csdn.net/rayborn1105/article/details/8192142 在我们的程序设计中经常需要对一些参数进行配置,配置好后还要在下一次启动仍然有效 ...

  8. c读取ini配置文件_Go-INI - 超赞的Go语言INI文件操作库

    INI 文件(Initialization File)是十分常用的配置文件格式,其由节(section).键(key)和值(value)组成,编写方便,表达性强,并能实现基本的配置分组功能,被各类软件 ...

  9. python3读取ini文件_python3配置文件ini读取方法

    1.最常用的Plain text形式的配置文件 1.1首选 .init 文件 标准库 configparser 1.2次选 csv文件 与 Unix/Linux 下常用的 xx = xxx形式的配置文 ...

最新文章

  1. 不再写死,SpringBoot实现动态增删启停定时任务
  2. URL 去重的 6 种方案!(附详细代码)
  3. Android开发环境的搭建
  4. 最古老的100个.com域名
  5. mysql 表分区 django_MySQL partition分区I
  6. php基础知识(六)
  7. Jquery赋值和取值input,combobox,numberbox........
  8. 【Linux】库文件
  9. aspnet网站开发实例_给自己开发一个网站,这是我的方法。
  10. python自动化办公能做什么-用Python自动办公,做职场高手(完结)
  11. 表达式求值详解(C++)
  12. 单例模式之懒汉式(三种代码实现)
  13. 计算机应用技术头像,意大利科学家应用计算机技术进行头像复原
  14. java 调用微信JsApi支付
  15. 礼金记账本安卓_礼金记账本
  16. kali Linux的简单介绍
  17. 手工皮具的大坑之路-封边感悟与工具
  18. Typora一款让你无法拒绝的MarkDown编辑器
  19. 面向未来,镭速助力企业构建文件安全外发新生态
  20. Android 内存被异常回收后直接重启APP

热门文章

  1. Win32汇编学习(10):对话框(1)
  2. SolidWorks二次开发语法技巧及基础
  3. 基于ThinkPHP3.2.3的微信OAuth2.0微信网页授权
  4. 开启合同签署新方式!百度超级链推出区块链智能签约服务
  5. SpringBoot整合篇-雷丰阳-专题视频课程
  6. 鼠标工具绘制(电子围栏,矢量图形,矢量编辑) 高德地图
  7. Tutorial教程:知错就改,错了就罚,论训练深度学习如何选择损失函数
  8. Jaspersoft报no markup processor factory specified for markup
  9. 在notepad++每行首尾添加字符
  10. 1145. Hashing - Average Search Time (25)