我正在尝试阅读java多行i18n属性文件。有这样的行:
messages.welcome=Hello\
World!
messages.bye=bye
使用此代码:
import configobj
properties = configobj.ConfigObj(propertyFileName)
但是对于多行值,它会失败。
有什么建议吗?
答案 0 :(得分:5)
根据ConfigObj documentation,configobj
要求您用三引号括起多行值:
包含换行符的值 (多行值)可以被包围 三重引号。这些也可以 如果值包含两种类型,则使用 引号。列表成员不能 被三重引号包围:
如果修改属性文件是不可能的,我建议使用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)
感谢您的回答,这就是我最终做的事情:
这是代码的摘录:
#!/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)
答案 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')]