¿Cómo puedo obtener el sangrado para ser incluido en un valor de varias líneas cuando se leen de ConfigParser en Python?

Jonathan Allen subvención:

Tengo algún archivo de configuración de esta manera:

[main]
key_one   =
  hello
    this
      is
        indented

Pero cuando lo leí usando la biblioteca ConfigParser en Python, así:

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

Imprime:

hello
this
is
indented

He intentado usar pestañas, más de dos espacios por guión, nada parece funcionar. ¿Cómo puedo obtener ConfigParser reconocer guiones?

chepner:

El analizador en sí siempre se tira espacios iniciales; por lo que yo puedo decir, no hay manera (recomendado) para cambiar eso.

Una solución es utilizar un personaje no está en blanco para indicar el comienzo de su texto con formato, a continuación, la tira que después de leer el archivo. Por ejemplo,

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

Luego, en la secuencia de comandos

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)

que produce

$ python3 tmp.py
 hello
   this
     is
       indented

El valor se inicia inmediatamente después de la =(Moví su primera línea de arriba, suponiendo que realmente no desea que el valor de empezar con un carácter de nueva línea). El analizador conserva cualquier espacio en blanco no se arrastra después | , ya que el primero no está en blanco en cada línea. re.subeliminará la inicial |de cada línea, dejando la cadena de múltiples líneas con sangría deseado como el resultado.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=372967&siteId=1
Recomendado
Clasificación