Как читать многострочный файл .properties в python - PullRequest
4 голосов
/ 13 мая 2011

Я пытаюсь прочитать файл свойств многострочного Java i18n.Имея такие строки:

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

Используя этот код:

import configobj
properties = configobj.ConfigObj(propertyFileName)

Но при многоканальных значениях это не получается.

Есть предложения?

Ответы [ 5 ]

5 голосов
/ 13 мая 2011

В соответствии с документацией 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')]

1 голос
/ 16 мая 2011

Спасибо за ответы, вот что я наконец-то сделал:

  • Добавьте раздел в первую строку файла свойств
  • Удалите пустые строки
  • Разбор с 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 мог добиться цели.

0 голосов
/ 13 мая 2011

Я ничего не понимаю в бульоне 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')]
0 голосов
/ 13 мая 2011

Попробуйте ConfigParser

0 голосов
/ 13 мая 2011

Отформатируйте файл свойств следующим образом:

messages.welcome="""Hello
 World!"""
messages.bye=bye
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...