Cómo utilizar archivos de texto como plantillas en Python

¿Alguna vez les ha pasado que están trabajando en un proyecto y uno de los requerimientos es construir un archivo de texto con algún formato en específico el cual sería bastante complejo de producir caracter por caracter? Por ejemplo, algún archivo de configuración para un programa de escritorio o para producir alguna entrada para un comando.

Este tipo de tareas suelen hacerse con sistemas de Templating como Jinja2, sin embargo, si lo que queremos hacer es bastante sencillo, podemos aprovechar la clase string.Template de la librería standard de Python, esta nos ayuda a producir strings substituibles.

Para ejemplificarlo, supongamos que queremos producir este archivo de configuración para alguna app:

******************************************************************
***         Ejemplo de archivo de configuración                ***
******************************************************************

*************
*** SETUP  ***
*************
FirstName=Milton
LastName=Lenis
Page=La Logia de Python

En este caso queremos diligenciar los valores FirstName, LastName y Page de manera dinámica (Por ejemplo, mediante algún script, mediante una aplicación web o cualquier forma que se les ocurra para obtener información).

Entonces, crearemos un pequeño script para leer el archivo, substituir sus contenidos y guardar la salida en otro archivo, el resultado es tan sencillo como esto:

Primero necesitamos formatear el archivo para indicarle los lugares en los cuales deseamos introducir información, para este caso puede ser así

******************************************************************
**         Ejemplo de archivo de configuración                 ***
******************************************************************

*************
*** SETUP  ***
*************
FirstName=$first_name
LastName=$last_name
Page=$page

En cada sitio donde deseemos introducir algún valor debemos expresar las variables utilizando el símbolo $ y el nombre de la variable.

Luego el script de Python para reemplazarlo sería el siguiente:

from string import Template


# Abrimos el archivo del cual queremos leer, supongamos que en este caso
# el archivo se llama 'config.txt'
template_file = open('config.txt')

# Este es el contexto que le pasaremos al template, toma cada uno de los
# valores del diccionario y los reemplaza por las variables que coincidan en el
# template
values = {
    'first_name': 'Milton',
    'last_name': 'Lenis',
    'page': 'La Logia de Python'
}

# Creamos el template utilizando los contenidos del archivo, en general se le
# puede pasar strings
base_template = Template(template_file.read())

# Llamamos al método substitute con el contexto y nos devolverá un string con 
# los contenidos del template reemplazados
result = base_template.substitute(values_dict)

# Guardamos el resultado en un archivo el cual llamaremos 'config.sys' (Por ejemplo)
output_file = open('config.sys', 'w')
output_file.write(result)

Entonces, al abrir el archivo config.sys obtendremos el resultado deseado al principio del artículo.