Файл конфигурации со словарем, использующим python

Поэтому я пытаюсь использовать словарь внутри файла конфигурации, чтобы сохранить имя отчета для вызова API. Так что-то вроде этого:

report = {'/report1': '/https://apicall...', '/report2': '/https://apicall...'}

Мне нужно хранить несколько отчетов:apicalls для одного значения конфигурации. Я использую ConfigObj. Я прочитал там документацию, документацию, и там сказано, что я смогу это сделать. Мой код выглядит примерно так:

from configobj import ConfigObj
config = ConfigObj('settings.ini', unrepr=True)
for x in config['report']:
    # do something... 
    print x

Однако, когда он попадает в config=, он генерирует ошибку повышения. Я как бы потерялся здесь. Я даже скопировал и вставил их пример и то же самое, "поднял ошибку". Я использую python27 и у меня установлена ​​библиотека configobj.

4 ответа

Если вы не обязаны использовать INI файлы, вы могли бы рассмотреть возможность использования другого формата файла, более подходящего для обработки dictобъекты Глядя на файл примера, который вы дали, вы можете использовать JSON файлы, Python имеет встроенный модуль для обработки.

Пример:

Файл JSON "settings.json":

{"report": {"/report1": "/https://apicall...", "/report2": "/https://apicall..."}}

Код Python:

import json

with open("settings.json") as jsonfile:
    # `json.loads` parses a string in json format
    reports_dict = json.load(jsonfile)
    for report in reports_dict['report']:
        # Will print the dictionary keys
        # '/report1', '/report2'
        print report

У меня была похожая проблема при попытке прочитать INI-файл:

[Section]
Value: {"Min": -0.2 , "Max": 0.2}

Закончилось использованием комбинации парсера конфигурации и json:

import ConfigParser
import json
IniRead = ConfigParser.ConfigParser()
IniRead.read('{0}\{1}'.format(config_path, 'config.ini'))
value = json.loads(IniRead.get('Section', 'Value'))

Очевидно, что можно использовать другие анализаторы текстовых файлов, поскольку для загрузки json требуется только строка в формате json. Одна проблема, с которой я столкнулся, заключалась в том, что ключи в строке dictionary / json должны быть в двойных кавычках.

Ваш конфигурационный файл settings.ini должен быть в следующем формате:

[report]
/report1 = /https://apicall...
/report2 = /https://apicall...

from configobj import ConfigObj

config = ConfigObj('settings.ini')
for report, url in config['report'].items():
    print report, url

Если вы хотите использовать unrepr=True, вам нужно

Этот файл конфигурации, используемый в качестве входных данных, подходит:

report = {'/report1': '/https://apicall...', '/report2': '/https://apicall...'}

Этот файл конфигурации используется в качестве входных данных

flag = true
report = {'/report1': '/https://apicall...', '/report2': '/https://apicall...'}

генерирует это исключение, которое выглядит как то, что вы получаете:

O:\_bats>configobj-test.py
Traceback (most recent call last):
  File "O:\_bats\configobj-test.py", line 43, in <module>
    config = ConfigObj('configobj-test.ini', unrepr=True)
  File "c:\Python27\lib\site-packages\configobj.py", line 1242, in __init__
    self._load(infile, configspec)
  File "c:\Python27\lib\site-packages\configobj.py", line 1332, in _load
    raise error
configobj.UnreprError: Unknown name or type in value at line 1.

С unrepr режим включен, вы должны использовать допустимые ключевые слова Python. В моем примере я использовал true вместо True, Я предполагаю, что у вас есть другие настройки в вашем Settings.ini которые вызывают исключение.

Опция unrepr позволяет вам хранить и извлекать основные типы данных Python, используя конфигурационные файлы. Он должен использовать немного другой синтаксис для обычных файлов ConfigObj. Неудивительно, что он использует синтаксис Python. Это означает, что списки различны (они заключены в квадратные скобки), и строки должны быть заключены в кавычки.

Типы, с которыми может работать unrepr:

строки, списки, кортежи
Нет, верно, неверно
словари, целые числа, числа с плавающей запятой
длинные и комплексные числа

Другие вопросы по тегам