Как я могу читать списки в списке с помощью ConfigParser () в Python?

Я видел много ответов о том, как читать в списке с помощью ConfigParser в Python:

Но мне интересно, как я могу читать в списке с несколькими списками

Например, у меня есть config.ini:

[INPUT]
values = [[40000, 60000], [70000, 80000]]

Функция в моем main.py должна читать приведенное выше как:

[[40000, 60000], [70000, 80000]]

Я не уверен, имеет ли это значение, но значения могут быть списком любого размера, например:

[[40000, 60000]]

or

[[40000, 60000], [70000, 80000], [90000, 95000]]

Я знаю, что приведенное ниже не сработает, но для ясности я читаю списки в списке в main.py следующим образом:

self.values = config['INPUT']['values']

self существует, потому что я использую класс. Это мои объявления в начале main.py:

import configparser
config = configparser.ConfigParser()
config.sections()
config.read('config.ini')

person W. Churchill    schedule 11.04.2020    source источник


Ответы (1)


Вы можете сохранить список (или список списков, или dict, или что-то еще) в виде строки и использовать ast для его восстановления.

Конфиг:

[INPUT]
values = [[40000, 60000], [70000, 80000]]

И скрипт (упрощенный, поскольку чтение строковой переменной из конфигурации не проблема):

import ast
list_in_list = ast.literal_eval(string_var_read_from_config)
person Grzegorz Pudłowski    schedule 11.04.2020
comment
Я отформатировал свой файл конфигурации, чтобы читать в values как строку, подобную той, которую вы упомянули в своем ответе, могу ли я теперь прочитать ее в своем main.py следующим образом? self.values = ast.literal_eval(['INPUT']['values']), если я запустил это, я получаю TypeError: индексы списка должны быть целыми числами или фрагментами, а не str. Мне нужно, чтобы числа в списках читались как целые. - person W. Churchill; 11.04.2020
comment
Нет, вы забыли, что ваши значения хранятся в config объекте, поэтому self.values = ast.literal_eval(config['INPUT']['values']) - person Grzegorz Pudłowski; 12.04.2020
comment
Спасибо, ваше решение с использованием import ast сработало. Но я заметил, что для меня это сработало, если values в моем файле конфигурации не была строкой. values = '[[40000, 60000], [70000, 80000]]' не сработал для меня, потому что числа внутри списка все еще импортировались как строки, однако включение values = [[40000, 60000], [70000, 80000]] в мой файл конфигурации действительно сработало. Не уверен, почему это так, но, возможно, вы сможете подробнее рассказать об этом. - person W. Churchill; 14.04.2020
comment
Я поправился. По умолчанию парсер конфигурации считывает это значение как строку. Если вы добавляете кавычки, он читает строку с кавычками в ней. Модуль ast должен распознать это как строку, и он это сделал. Итак ... без кавычек. - person Grzegorz Pudłowski; 15.04.2020