具有许可证的纯python libconfig读写器
libconf的Python项目详细描述
LBCONF是一个纯的Python读写器,用于在{a1}中配置文件,这在C/C++项目中经常使用。它的接口类似于 json模块:四个主要方法是load(),loads(), dump(),和dumps()。
示例用法:
import io, libconf >>> with io.open('example.cfg') as f: ... config = libconf.load(f) >>> config {'capabilities': {'can-do-arrays': [3, 'yes', True], 'can-do-lists': (True, 14880, ('sublist',), {'subgroup': 'ok'})}, 'version': 7, 'window': {'position': {'h': 600, 'w': 800, 'x': 375, 'y': 210}, 'title': 'libconfig example'}} >>> config['window']['title'] 'libconfig example' >>> config.window.title 'libconfig example' >>> print(libconf.dumps({'size': [10, 15], 'flag': True})) flag = True; size = [ 10, 15 ];<>数据可以通过索引(^ {Tt5}$)或通过属性访问。 访问.title。
字符编码和转义序列
建议对unicode对象(unicodeon)使用libconf Python2,str在Python3)。为load()和输入字符串或流 loads()应该是unicode,数据中包含的所有字符串也应该是unicode 传递给dump()和dumps()的结构。
在load()和loads()中,转义序列(例如\n,\r, \t,或\xNN)已解码。十六进制转义(\xNN)映射到Unicode 字符U+0000到U+00FF。所有其他字符都按原样传递。
在dump()和dumps()中,u+0080以下的不可打印字符被转义 作为\n、\r、\t、\f或\xNN序列。字符U+0080 以上都是按原样通过的。
写入libconfig文件
读取libconfig文件很容易。写作难度有两个因素:
- libconfig在int and int64:2vs.2L 之间的区别
- libconfig在lists和arrays之间的区别,以及 数组的限制
第一点涉及编写pythonint值。libconf转储值 它适合于不包含“L”后缀的C/C++范围内。对于更大的 值时,将自动添加一个“L”后缀。强制添加“l” 即使是32位整数范围内的数字,也要在 LibconfInt64类。
示例:
dumps({'value': 2}) # Returns "value = 2;" dumps({'value': 2**32}) # Returns "value = 4294967296L;" dumps({'value': LibconfInt64(2)}) # Explicit int64, returns "value = 2L;"
第二个并发症来自于lists和arrays之间的区别 在libconfig语言中。列表由()括号括起来,并且可以 其中包含任意值。数组由[]方括号括起来, 并且有明显的限制:所有值都必须是标量(int、float、bool, 字符串)并且必须是同一类型。
libconf使用以下约定:
- 它将libconfig()列表映射到python元组,后者还使用() 语法。
- 它将libconfig[]数组映射到python列表,python列表还使用[] 语法。
这在两种语言之间提供了很好的对称性,但有一个缺点 转储python列表继承了libconfig数组的限制。 要显式控制是否转储列表或数组,请包装python 列表/元组位于LibconfList或LibconfArray中。
示例:
# Libconfig lists (=Python tuples) can contain arbitrary complex types: dumps({'libconf_list': (1, True, {})}) # Libconfig arrays (=Python lists) must contain scalars of the same type: dumps({'libconf_array': [1, 2, 3]}) # Equivalent, but more explit by using LibconfList/LibconfArray: dumps({'libconf_list': LibconfList([1, True, {}])}) dumps({'libconf_array': LibconfArray([1, 2, 3])})
与其他python libconfig库的比较
Pylibconfig2是另一个纯python libconfig读取器。是API 是基于C++接口,而不是Python ^ {A2}模块。 它是根据gplv3授权的,这使得它不适合大量使用 项目数量。
Python-libconfig是一个库,它为 LICONFIG++C++库。虽然许可证(BSD)要求 安装时的编译步骤,这可能是一个缺点。
我写了LBCONF(这个图书馆),因为两个现存的图书馆都没有。 符合我的要求。我有一个与工作相关的项目不是开源的 (排除Pylibconfig2)我不想让 python库配置。此外,我喜欢编写解析器,这看起来很不错 机会:-)发行说明
- 2.0.0,发布于2018-11-23
- dump()和dumps()的输出验证:在以下情况下引发异常 正在转储C libconfig实现无法读取的数据。 此更改可能会对使用<;2.0.0!的代码引发异常!
- 为添加LibconfList,LibconfArray,LibconfInt64类 对dump()/dumps()输出进行更细粒度的控制。
- F型ixAttrDict类中的deepcopy()(谢谢anandtella)。
- 1.0.1,2017-01-06发布
- 在读取较大文件时显著提高性能
- 一些较小的改进和修复
- 1.0.0,2016-10-26发布:
- 添加写入libconf文件的能力(dump()和dumps(), 感谢clarkli86和eatsan)
- 一些较小的改进和修复
- 0.9.2,2016-09-09发布:
- 修复与早于2.7.6的python版本的兼容性(感谢anandtella)