Как прочитать файл свойств в python

У меня есть файл свойств, например

Configuration.properties
path=/usr/bin
db=mysql
data_path=/temp

Мне нужно прочитать этот файл и использовать переменную, такую ​​как path, db и data_path, в моих последующих сценариях. Могу ли я сделать это с помощью configParser или просто прочитать файл и получить значение. Заранее спасибо.


person Deepika Soren    schedule 14.01.2015    source источник
comment
Является ли первая строка «Configuration.properties» частью файла данных?   -  person Hai Vu    schedule 14.01.2015
comment
нет это имя файла   -  person Deepika Soren    schedule 14.01.2015


Ответы (6)


Для файла конфигурации без заголовков разделов, окруженных [], вы обнаружите, что выдается исключение ConfigParser.NoSectionError. Для этого есть обходные пути, вставив «поддельный» заголовок раздела, как показано в этом ответ.

Если файл простой, как указано в ответе pcalcao, вы можете выполнить некоторые манипуляции со строками для извлечения значений.

Вот фрагмент кода, который возвращает словарь пар ключ-значение для каждого из элементов в вашем файле конфигурации.

separator = "="
keys = {}

# I named your file conf and stored it 
# in the same directory as the script

with open('conf') as f:

    for line in f:
        if separator in line:

            # Find the name and value by splitting the string
            name, value = line.split(separator, 1)

            # Assign key value pair to dict
            # strip() removes white space from the ends of strings
            keys[name.strip()] = value.strip()

print(keys)
person petedunc88    schedule 15.01.2015
comment
Но configparser сделает это за вас. В любом случае, проверьте мой ответ ниже, чтобы прочитать файл конфигурации ЧИСТЫМ способом, используя RawConfigParser(), и легко получить диктовку для всех элементов из раздела в файле конфигурации. - person MANU; 07.05.2017

Если вам нужно прочитать все значения из раздела в файле свойств простым способом:

Ваш config.properties макет файла:

[SECTION_NAME]  
key1 = value1  
key2 = value2  

Вы кодируете:

   import configparser

   config = configparser.RawConfigParser()
   config.read('path_to_config.properties file')

   details_dict = dict(config.items('SECTION_NAME'))

Это даст вам словарь, в котором ключи такие же, как в файле конфигурации, и их соответствующие значения.

details_dict is :

{'key1':'value1', 'key2':'value2'}

Теперь, чтобы получить значение key1: details_dict['key1']

Поместив все это в метод, который читает этот раздел из файла конфигурации только один раз (в первый раз, когда метод вызывается во время запуска программы).

def get_config_dict():
    if not hasattr(get_config_dict, 'config_dict'):
        get_config_dict.config_dict = dict(config.items('SECTION_NAME'))
    return get_config_dict.config_dict

Теперь вызовите вышеуказанную функцию и получите требуемое значение ключа:

config_details = get_config_dict()
key_1_value = config_details['key1'] 

-------------------------------------------------------------

Расширение подхода, упомянутого выше, автоматическое чтение раздела за разделом, а затем доступ по имени раздела, за которым следует имя ключа.

def get_config_section():
    if not hasattr(get_config_section, 'section_dict'):
        get_config_section.section_dict = dict()

        for section in config.sections():
            get_config_section.section_dict[section] = 
                             dict(config.items(section))

    return get_config_section.section_dict

Для доступа:

config_dict = get_config_section()

port = config_dict['DB']['port'] 

(здесь «БД» — это имя раздела в файле конфигурации, а «порт» — это ключ в разделе «БД».)

person MANU    schedule 17.01.2017
comment
Может ли файл .properties работать с camelCase? У меня есть ключ с именем userId, но он каким-то образом преобразуется в нижний регистр, когда я печатаю значение. - person flarkmarup; 10.03.2020
comment
@flarkmarup попробуйте добавить _ между ними и преобразовать в метод, используемый для чтения ... когда встречается '_', немедленно сделайте следующий символ заглавным и создайте строку. - person MANU; 22.07.2020

Мне нравится текущий ответ. И... мне кажется, что в "реальном мире" есть более чистый способ. Использование функции заголовка раздела НЕОБХОДИМО, если вы делаете проект любого размера или масштаба, особенно в области «множественных» сред. Я хотел поместить его сюда с хорошо отформатированным копируемым кодом, используя надежный пример из реального мира. Это работает в Ubuntu 14, но работает кроссплатформенно:

Простой пример реального мира

Конфигурация «на основе среды»
Пример настройки (терминал):

cd ~/my/cool/project touch local.properties touch environ.properties ls -la ~/my/cool/project -rwx------ 1 www-data www-data 0 24 января 23:37 local.properties -rwx------ 1 www-data www-data 0 24 января 23:37 environ.properties

Установите хорошие разрешения

>> chmod 644 local.properties
>> chmod 644 env.properties
>> ls -la
-rwxr--r-- 1 www-data www-data  0 Jan 24 23:37 local.properties
-rwxr--r-- 1 www-data www-data  0 Jan 24 23:37 environ.properties

Отредактируйте файлы свойств.

ФАЙЛ 1: local.properties

Это ВАШ файл свойств, локальный для вашего компьютера и рабочей области, и он содержит конфиденциальные данные, не передавайте их в систему управления версиями!!!

[global]
relPath=local/path/to/images              
filefilters=(.jpg)|(.png)

[dev.mysql]
dbPwd=localpwd
dbUser=localrootuser

[prod.mysql]
dbPwd=5tR0ngpwD!@#
dbUser=serverRootUser

[branch]
# change this to point the script at a specific environment
env=dev

ФАЙЛ 2: environ.properties

Этот файл свойств доступен всем, изменения передаются в систему управления версиями

#----------------------------------------------------
# Dev Environment
#----------------------------------------------------

[dev.mysql]
dbUrl=localhost
dbName=db

[dev.ftp]
site=localhost
uploaddir=http://localhost/www/public/images

[dev.cdn]
url=http://localhost/cdn/www/images


#----------------------------------------------------
# Prod Environment
#----------------------------------------------------
[prod.mysql]
dbUrl=http://yoursite.com:80
dbName=db

[prod.ftp]
site=ftp.yoursite.com:22
uploaddir=/www/public/

[prod.cdn]
url=http://s3.amazon.com/your/images/

Файл Python: readCfg.py

Этот скрипт представляет собой многократно используемый фрагмент для загрузки списка файлов конфигурации import ConfigParser import os

# a simple function to read an array of configuration files into a config object
def read_config(cfg_files):
    if(cfg_files != None):
        config = ConfigParser.RawConfigParser()

        # merges all files into a single config
        for i, cfg_file in enumerate(cfg_files):
            if(os.path.exists(cfg_file)):
                config.read(cfg_file)

        return config

Файл Python: yourCoolProgram.py

Эта программа импортирует указанный выше файл и вызовет метод read_config

from readCfg import read_config

#merge all into one config dictionary
config      = read_config(['local.properties', 'environ.properties'])

if(config == None):
    return

# get the current branch (from local.properties)
env      = config.get('branch','env')        

# proceed to point everything at the 'branched' resources
dbUrl       = config.get(env+'.mysql','dbUrl')
dbUser      = config.get(env+'.mysql','dbUser')
dbPwd       = config.get(env+'.mysql','dbPwd')
dbName      = config.get(env+'.mysql','dbName')

# global values
relPath = config.get('global','relPath')
filefilterList = config.get('global','filefilters').split('|')

print "files are: ", fileFilterList, "relative dir is: ", relPath
print "branch is: ", env, " sensitive data: ", dbUser, dbPwd

Вывод

Учитывая приведенную выше конфигурацию, теперь у вас может быть сценарий, который полностью меняет среду, изменяя значение [branch]env в «local.properties». И все это основано на принципах хорошей конфигурации! Ура!

person Decoded    schedule 25.01.2016

Да, да, вы можете.

ConfigParser (https://docs.python.org/2/library/configparser.html) даст вам симпатичную небольшую структуру для получения значений из коробки, где выполнение вручную потребует некоторого разделения строк, но для файла простого формата это не имеет большого значения.

Есть вопрос "Как мне прочитать этот файл?".

person pcalcao    schedule 14.01.2015
comment
Это мой код: #!/usr/bin/python import ConfigParser configParser = ConfigParser.RawConfigParser() configFilePath = r'/opt/aor/regression/test_scenarios/log/deepikaLogs/Config.cfg' configParser.read(configFilePath) path1 = configParser.get('Script_path', 'HOMEPATH') print path1 Я получаю сообщение об ошибке ConfigParser.NoSectionError: No section: 'Script_path' . Мой ConfigParser выглядит примерно так: [Script_path] HOMEPATH=/opt/aor/regression/test_scenario [ScenarioFile_path] SCENARIO_FILE_PATH=/opt/aor/regression/test_scenarios/MOB_ACC - person Deepika Soren; 14.01.2015

Один вкладыш для чтения неструктурированного файла свойств (без разделов) с игнорированием комментариев:

with open(props_file_path, "r", encoding="utf-8") as f:
    props = {e[0]: e[1] for e in [line.split('#')[0].strip().split('=') for line in f] if len(e) == 2}
person Doron Cohen    schedule 06.11.2020

Если вы хотите прочитать файл свойств на python, мое первое предложение, которому я сам не следую, потому что мне слишком нравится Visual Code...

Запустите свой питон на Jython. И как только вы запустите python на Jython, вы можете тривиально открыть входной поток java util в свой файл данных. А используя java.utl.Properties, вы можете вызвать API-интерфейс load(), и все готово. Поэтому я рекомендую делать то, что проще всего, просто начните использовать среду выполнения Java и jython вместе с ней.

Кстати, я, конечно, использую jython для запуска python. Никаких вопросов по этому поводу.

Но чего я не делаю, так это не использую jython для отладки python... к сожалению! Проблема для меня в том, что я использую визуальный код microsft для написания pythong, а потом да... тогда я застрял на своей обычной установке python. Не идеальный мир!

Если бы это была ваша ситуация. Тогда можно переходить к плану (б)... Постараться не использовать библиотеки JDK и найти альтернативу еще где.

Итак, вот внушение. Это библиотека, которую я обнаружил и которую я использую для эффекта чтения файлов свойств. https://pypi.python.org/pypi/jproperties/1.0.1#downloads

from jproperties import Properties
with open("foobar.properties", "r+b") as f:
    p = Properties()
    p.load(f, "utf-8")

    # Do stuff with the p object...

    f.truncate(0)
    p.store(f, encoding="utf-8")

Итак, в приведенной выше цитате кода вы видели, как они открывают файл свойств. Сотрите его и снова запишите свойства в файл.

Вы обрабатываете объект свойств как объект словаря. И затем вы делаете такие вещи, как:

myPropertiesTuple = propertiesObjec[myPropertyKey]

Будь осторожен. Когда вы используете вышеуказанный API и получаете значение для ключа, это значение является PropertiesTuple. Это пара (значение, метаданные). Таким образом, значение, которое вы будете искать, вы получите из myPropertiesTuple[0]. Кроме того, просто прочитайте документацию на странице, библиотека работает хорошо.

Я использую подход (б). Если преимущество использования библиотек Java в какой-то момент перевешивает преимущество использования родного языка Python просто для того, чтобы я мог отлаживать визуальный код.

Я услышу, что поддержка beat drop для чистой среды выполнения Python и компрометация кода с жесткими зависимостями Jython runtime/библиотеки Java. Пока в этом нет необходимости.

Итак, синяя купюра или красная таблетка?

person 99Sono    schedule 14.07.2017