语法文件的解析器
jprops的Python项目详细描述
支持Python2.6、2.7和3.3+
安装
使用pip从pypi安装jprops:
pip install jprops
用法
读取属性
使用jprops.load_properties读取属性文件并返回普通 Pythondict:
import jprops with open('mine.properties') as fp: properties = jprops.load_properties(fp)
您可以提供自定义的“映射”以将属性加载到不同的数据中 结构。例如,如果希望保持属性不变 它们最初出现的顺序,您可以使用“顺序dict”,例如 collections.OrderedDict。“映射”可以是任何类型或函数 接受一个iterable of(key,value)对:
import collections with open('mine.properties') as fp: properties = jprops.load_properties(fp, collections.OrderedDict)
load_properties只是iter_properties的包装,您可以使用它 如果要在不加载所有属性的情况下懒洋洋地处理属性,请直接执行 进入数据结构:
with open('mine.properties') as fp: for key, value in jprops.iter_properties(fp): if key.startswith('foo'): print key, value
写入属性
使用jprops.store_properties来编写dict、类dict对象或任何 一个文件可以有(键,值)对:
x = {'y': '1', 'z': '2'} with open('out.properties', 'w') as fp: jprops.store_properties(fp, x)
默认情况下,jprops遵循将时间戳注释写入 文件的开头,例如:
#Thu Oct 06 19:08:50 EDT 2011 y=1 z=2
您可以通过传递timestamp=False来禁止写入时间戳注释。
您可以提供出现在时间戳之前的自定义头注释。 适当地处理多行注释,继续注释 行:
jprops.store_properties(fp, {'x': '1'}, comment='Hello\nworld!')
#Hello #world! #Thu Oct 06 19:17:21 EDT 2011 x=1
您还可以使用write_comment和write_property进行细粒度 控制写入属性文件:
with open('out.properties', 'w') as fp: jprops.write_comment(fp, 'the hostname:') jprops.write_property(fp, 'host', 'localhost') jprops.write_comment(fp, 'the port number:') jprops.write_property(fp, 'port', '443')
#the hostname: host=localhost #the port number: port=443
文件编码和Unicode
以二进制模式打开的文件,如open(filename, 'rb')或 open(filename, 'wb')将使用latin-1编码和转义unicode 与java兼容的格式为\uffff的字符 Properties字节流编码。
从2.0版开始,使用其他文本编码打开的文件 支持:
with io.open('sample.properties', encoding='utf-8') as fp: props = jprops.load_properties(fp)
这适用于内置的open函数、codecs.open或io.open。 扩展io.TextIOBase或具有非空 encoding属性将作为Unicode文本值读取或写入,否则 它们将被视为二进制的,读或写为latin-1编码字节。
更改
2.0.2(2017-04-21)
- 发布前setup.py中的bump版本
2.0.1(未发布)
- 修复值中的过度转义问题
2.0(2017-04-08)
- 支持用文本编码打开的文件
- 很好的jprops.COMMENT
1.0(2013-06-12)
- python 3.3支持
- 尝试写入非字符串值时出现更多信息错误
0.2(2012-05-02)
- 处理窗口或mac行结尾
0.1(2011-10-07)
初次发布。
评论
默认情况下,输入中的注释将被忽略,但它们可以包含在 iter_properties通过传递comments=True。评论将包括在内 使用jprops.COMMENT作为sentinal值代替键:
jprops不包含任何用于保存注释的特殊数据结构, 但在写回属性之前,可以对其进行操作。例如 这是一个在写入输出时更改属性的简单模式: