Файл конфигурации со словарем, использующим 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:
строки, списки, кортежи
Нет, верно, неверно
словари, целые числа, числа с плавающей запятой
длинные и комплексные числа