Файл свойств в Python (похож на свойства Java) - PullRequest
118 голосов
/ 29 августа 2010

Учитывая следующий формат ( .properties или .ini ):

propertyName1=propertyValue1
propertyName2=propertyValue2
...
propertyNameN=propertyValueN

Для Java есть Свойства класс, который предлагает функциональность для анализа / взаимодействия с вышеуказанным форматом.

Есть ли что-то похожее в python s standard library (2.x)?

Если нет, какие у меня есть альтернативы?

Ответы [ 23 ]

61 голосов
/ 06 октября 2014

Мне удалось заставить это работать с ConfigParser, никто не показал никаких примеров того, как это сделать, поэтому здесь есть простое чтение на python файла свойств и пример файла свойств. Обратите внимание, что расширение по-прежнему .properties, но мне пришлось добавить заголовок раздела, похожий на тот, который вы видите в файлах .ini ... немного подонок, но он работает.

Файл Python: PythonPropertyReader.py

#!/usr/bin/python    
import ConfigParser
config = ConfigParser.RawConfigParser()
config.read('ConfigFile.properties')

print config.get('DatabaseSection', 'database.dbname');

Файл объекта: ConfigFile.properties

[DatabaseSection]
database.dbname=unitTest
database.user=root
database.password=

Для большей функциональности читайте: https://docs.python.org/2/library/configparser.html

59 голосов
/ 29 августа 2010

Для файлов .ini существует модуль ConfigParser , который обеспечивает формат, совместимый с файлами .ini.

В любом случае, нет ничего доступного для разбора полных файлов .properties, когда мне нужно это сделать, я просто использую jython (я говорю о скриптах).

58 голосов
/ 22 ноября 2011

Файл свойств Java также является допустимым кодом Python. Вы можете переименовать файл myconfig.properties в myconfig.py. Затем просто импортируйте ваш файл, как это

import myconfig

и доступ к свойствам напрямую

print myconfig.propertyName1
46 голосов
/ 06 августа 2015

Я знаю, что это очень старый вопрос, но он мне нужен только сейчас, и я решил реализовать свое собственное решение, решение на чистом Python, которое охватывает большинство случаев (не все):

def load_properties(filepath, sep='=', comment_char='#'):
    """
    Read the file passed as parameter as a properties file.
    """
    props = {}
    with open(filepath, "rt") as f:
        for line in f:
            l = line.strip()
            if l and not l.startswith(comment_char):
                key_value = l.split(sep)
                key = key_value[0].strip()
                value = sep.join(key_value[1:]).strip().strip('"') 
                props[key] = value 
    return props

Вы можете изменить sep на ':' для разбора файлов в формате:

key : value

Код правильно разбирает строки вроде:

url = "http://my-host.com"
name = Paul = Pablo
# This comment line will be ignored

Вы получите диктант с:

{"url": "http://my-host.com", "name": "Paul = Pablo" }
16 голосов
/ 30 ноября 2011

Если у вас есть опция форматов файлов, я предлагаю использовать .ini и Python ConfigParser, как уже упоминалось. Если вам нужна совместимость с файлами Java .properties, я написал для нее библиотеку под названием jprops . Мы использовали pyjavaproperties, но, столкнувшись с различными ограничениями, я реализовал свои собственные. Он имеет полную поддержку формата .properties, включая поддержку юникода и лучшую поддержку escape-последовательностей. Jprops также может анализировать любой файлоподобный объект, тогда как pyjavaproperties работает только с реальными файлами на диске.

6 голосов
/ 10 июля 2018

если у вас нет многострочных свойств и очень простая необходимость, несколько строк кода могут решить эту проблему для вас:

Файл t.properties:

a=b
c=d
e=f

Pythonкод:

with open("t.properties") as f:
    l = [line.split("=") for line in f.readlines()]
    d = {key.strip(): value.strip() for key, value in l}
6 голосов
/ 29 августа 2010

Это не совсем свойства, но в Python есть хорошая библиотека для разбора файлов конфигурации. Также посмотрите этот рецепт: Замена Python для java.util.Properties .

4 голосов
/ 29 октября 2012

Вот ссылка на мой проект: https://sourceforge.net/projects/pyproperties/. Это библиотека с методами работы с файлами * .properties для Python 3.x.

Но это не основано на java.util.Properties

2 голосов
/ 18 мая 2017

Вы можете использовать файловый объект в ConfigParser.RawConfigParser.readfp, определенном здесь -> https://docs.python.org/2/library/configparser.html#ConfigParser.RawConfigParser.readfp

Определить класс, который переопределяет readline, который добавляет имя раздела перед фактическим содержимым файла свойств.

Я упаковал его в класс, который возвращает dict всех определенных свойств.

import ConfigParser

class PropertiesReader(object):

    def __init__(self, properties_file_name):
        self.name = properties_file_name
        self.main_section = 'main'

        # Add dummy section on top
        self.lines = [ '[%s]\n' % self.main_section ]

        with open(properties_file_name) as f:
            self.lines.extend(f.readlines())

        # This makes sure that iterator in readfp stops
        self.lines.append('')

    def readline(self):
        return self.lines.pop(0)

    def read_properties(self):
        config = ConfigParser.RawConfigParser()

        # Without next line the property names will be lowercased
        config.optionxform = str

        config.readfp(self)
        return dict(config.items(self.main_section))

if __name__ == '__main__':
    print PropertiesReader('/path/to/file.properties').read_properties()
2 голосов
/ 28 мая 2016

Я создал модуль python, который почти аналогичен классу свойств Java (на самом деле он похож на PropertyPlaceholderConfigurer весной, который позволяет использовать $ {variable-reference} для ссылки на уже определенное свойство)

РЕДАКТИРОВАТЬ: Вы можете установить этот пакет, выполнив команду (в настоящее время тестируется на Python 3).
pip install property

Проект размещен на GitHub

Пример: (подробную документацию можно найти здесь )

Допустим, у вас есть следующие свойства, определенные в файле my_file.properties

foo = I am awesome
bar = ${chocolate}-bar
chocolate = fudge

Код для загрузки вышеуказанных свойств

from properties.p import Property

prop = Property()
# Simply load it into a dictionary
dic_prop = prop.load_property_files('my_file.properties')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...