如何在python中读取多行.properties文件

时间:2011-05-12 21:19:19

标签: python properties multiline

我正在尝试阅读java多行i18n属性文件。有这样的行:

messages.welcome=Hello\
 World!
messages.bye=bye

使用此代码:

import configobj
properties = configobj.ConfigObj(propertyFileName)

但是对于多行值,它会失败。

有什么建议吗?

5 个答案:

答案 0 :(得分:5)

根据ConfigObj documentationconfigobj要求您用三引号括起多行值:

  

包含换行符的值   (多行值)可以被包围   三重引号。这些也可以   如果值包含两种类型,则使用   引号。列表成员不能   被三重引号包围:

如果修改属性文件是不可能的,我建议使用configparser

  

在配置解析器中,值可以跨越   只要它们是多行   缩进比包含的键更多   他们。默认情况下,解析器也允许   空行是值的一部分。

以下是概念的快速证明:

#!/usr/bin/env python
# coding: utf-8

from __future__ import print_function

try:
    import ConfigParser as configparser
except ImportError:
    import configparser

try:
    import StringIO
except ImportError:
    import io.StringIO as StringIO

test_ini = """
[some_section]
messages.welcome=Hello\
 World
messages.bye=bye
"""
config = configparser.ConfigParser()
config.readfp(StringIO.StringIO(test_ini))
print(config.items('some_section'))

输出:

  

[('messages.welcome','Hello World'),   ('messages.bye','再见')]

答案 1 :(得分:1)

感谢您的回答,这就是我最终做的事情:

  • 将该部分添加到属性文件的第一行
  • 删除空行
  • 使用configparser解析
  • 删除第一行(第一步中添加的部分)

这是代码的摘录:

#!/usr/bin/python
...
# Add the section
subprocess.Popen(['/bin/bash','-c','sed -i \'1i [default]\' '+srcDirectory+"/*.properties"], stdout=subprocess.PIPE)
# Remove empty lines
subprocess.Popen(['/bin/bash','-c','sed -i \'s/^$/#/g' '+srcDirectory+"/*.properties"], stdout=subprocess.PIPE)
# Get all i18n files
files=glob.glob(srcDirectory+"/"+baseFileName+"_*.properties")
config = ConfigParser.ConfigParser()
for propFile in files:
...
    config.read(propertyFileName)
    value=config.get('default',"someproperty")
...
# Remove section 
subprocess.Popen(['/bin/bash','-c','sed -i \'1d\' '+srcDirectory+"/*.properties"], stdout=subprocess.PIPE)

对于那些不以空白空间开头的多线,我仍然遇到麻烦。我只是手动修复它们,但是sed可以解决这个问题。

答案 2 :(得分:0)

将属性文件格式化为:

messages.welcome="""Hello
 World!"""
messages.bye=bye

答案 3 :(得分:0)

尝试ConfigParser

答案 4 :(得分:0)

我对Java汤中的任何内容都不了解,但我希望正则表达式可以帮到你:

import re

ch = '''messages.welcome=Hello
  World!  
messages.bye=bye'''

regx = re.compile('^(messages\.[^= \t]+)[ \t]*=[ \t]*(.+?)(?=^messages\.|\Z)',re.MULTILINE|re.DOTALL)

print regx.findall(ch)

结果

[('messages.welcome', 'Hello\n  World!  \n'), ('messages.bye', 'bye')]