Как получить отступ для многострочного значения при чтении из configparser в python? - PullRequest
2 голосов
/ 26 марта 2020

У меня есть некоторый конфигурационный файл, подобный этому:

[main]
key_one   =
  hello
    this
      is
        indented

Но когда я читаю его, используя библиотеку configparser в python, примерно так:

import configparser
cfg = configparser.ConfigParser()
cfg.read("path/to/file.ini")
print(cfg["main"]["key_one"])

Распечатывается:

hello
this
is
indented

Я пробовал использовать вкладки, более двух пробелов на отступ, кажется, ничего не работает. Как мне заставить configparser распознавать отступы?

1 Ответ

1 голос
/ 26 марта 2020

Сам парсер всегда удаляет начальные пробелы; насколько я могу судить, не существует (рекомендуемого) способа изменить это.

Обходной путь - использовать символ без пробела, чтобы указать начало вашего отформатированного текста, а затем убрать его после прочтения файла. , Например,

[main]
key_one   =| hello
           |   this
           |     is
           |       indented

Затем в вашем скрипте

import configparser
import re

cfg = configparser.ConfigParser()
cfg.read("tmp.ini")
t = cfg["main"]["key_one"]
t = re.sub("^\|", "", t, flags=re.MULTILINE)
print(t)

, который выдает

$ python3 tmp.py
 hello
   this
     is
       indented

Значение начинается сразу после = (я переместил ваш первый выстроиться в линию, предполагая, что вы действительно не хотите, чтобы значение начиналось с символа новой строки). Синтаксический анализатор сохраняет любой непоследующий пробел после | в качестве первого непробельного символа в каждой строке. re.sub удалит начальный | из каждой строки, оставив желаемую многострочную строку с отступом в качестве результата.

...