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

4 投票
5 回答
6630 浏览
提问于 2025-04-16 17:32

我正在尝试读取一个Java的多行国际化属性文件。这个文件里有这样的内容:

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

我用以下代码来处理:

import configobj
properties = configobj.ConfigObj(propertyFileName)

但是当值是多行的时候,它就出错了。

有没有什么建议?

5 个回答

0

把你的属性文件格式化成这样:

messages.welcome="""Hello
 World!"""
messages.bye=bye
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命令也可以解决这个问题。

6

根据ConfigObj的文档,使用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', 'bye')]

撰写回答