语法文件的解析器

jprops的Python项目详细描述


Java .properties files的分析器。

支持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_commentwrite_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

评论

默认情况下,输入中的注释将被忽略,但它们可以包含在 iter_properties通过传递comments=True。评论将包括在内 使用jprops.COMMENT作为sentinal值代替键:

with open('in.properties') as fp:
  props = list(jprops.iter_properties(fp, comments=True))
for k, v in props:
  if k is jprops.COMMENT:
    print 'comment:', v

jprops不包含任何用于保存注释的特殊数据结构, 但在写回属性之前,可以对其进行操作。例如 这是一个在写入输出时更改属性的简单模式:

updates = {'one': '1', 'two': '2', 'to_remove': None}

with open('out.properties', 'w') as fp:
  for key, value in props:
    # updates.pop will return and remove the value for the key, or return
    # the original `value` if it doesn't exist
    value = updates.pop(key, value)
    # skip keys set to `None` in `updates`
    if value is not None:
      # write_property handles jprops.COMMENT as the key so you don't have to
      # check whether to use write_comment
      jprops.write_property(fp, key, value)
  # since the existing keys have already been popped, use store_properties
  # to write the remaining updates
  jprops.store_properties(fp, updates, timestamp=False)

文件编码和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.openio.open。 扩展io.TextIOBase或具有非空 encoding属性将作为Unicode文本值读取或写入,否则 它们将被视为二进制的,读或写为latin-1编码字节。

作者

哑光良好(matt@matt-good.net

更改

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)

初次发布。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
如果SQL server执行计划是流式传输数据,那么调用next()时Java ResultSet对象将如何反应?   java为什么水平滚动条永远不会出现在JTable上?   java如何在Android项目中添加SDK模块   绿脚:爪哇。lang.ClassCastException:无法将障碍物投射到球投射物   xslt需要在Java1.4.2中使用SaxonB(版本9.1.0.8)方面的帮助   java Apache HTTP客户端下载SOAP响应的一部分   为Java 9计划的“过滤传入序列化数据”解决了数据反序列化安全漏洞吗?   java如何使用drools对列表中的元素进行分组   java从匿名类到lambda表达式   Java中是否有不可变的单链表实现?   java动态添加按钮以滚动查看安卓   java GAE:无法为模块http请求设置管理员登录凭据   java如何在Hibernate 5 CriteriaBuilder中使用条件条件获取计数   java如何将JSON+HAL响应解析为POJO   java如何获取计算器程序,对两个以上的数字进行加、减、乘、除   java Thymeleaf+静态资源+@ResponseBody