Python ofrece un gran soporte para ope­ra­cio­nes con strings y pro­ce­sa­mie­n­to de texto. Este lenguaje contiene una amplia variedad de opciones para el formato y la salida del texto. Te pre­se­n­ta­mos los métodos más im­po­r­ta­n­tes de Python para el string format.

¿Para qué sirven los métodos de formato de cadenas de Python?

Los strings de Python son cadenas y pueden contener letras, palabras, frases o incluso do­cu­me­n­tos enteros. Los métodos para dar formato a estas cadenas son muy ne­ce­sa­rios, pero no nos referimos a ca­ra­c­te­rí­s­ti­cas estéticas como poner una letra en negrita en Word. ¿Qué significa el formato entonces?

Las cadenas pueden estar co­m­pue­s­tas de distintas partes. Muchas veces se quiere combinar co­m­po­ne­n­tes estáticos del string con datos variables, algo necesario para dar salida a los datos y crear do­cu­me­n­tos para el de­sa­rro­llo web.

Imagina que quieres crear una tienda online. Quieres que se calcule el precio total de los productos que hay en el carrito de la compra y que el usuario vea: “El total de compra es […] euros”. Una opción para co­n­se­gui­r­lo es en­sa­m­bla­n­do el string con un operador de co­n­ca­te­na­ción:

price = 69.42
message = "The total price is" + price + "EUR"
Python

De­s­gra­cia­da­me­n­te, así re­ci­bi­rías un mensaje de error ya que el precio es un número y no puede co­n­ca­te­nar­se con un string. Primero debemos convertir el número en un string con la función str():

message = "The total price is" + str(price) + "EUR"
Python

Sin embargo, esto puede volverse muy confuso. Lo mejor es definir todo el texto, in­clu­ye­n­do el marcador de posición, y re­lle­nar­lo con los datos. Para convertir los datos, quizá necesites ajustar su formato. Ju­s­ta­me­n­te para esto sirven los métodos de string format de Python.

¿Cómo funcionan los métodos de formato de cadenas de Python?

Python cuenta con diversos métodos de formato de strings, aunque cada uno tiene sus ventajas e in­co­n­ve­nie­n­tes. Cada vez hay más opciones, muy parecidas en muchos aspectos pero también con algunas di­fe­re­n­cias. Te exponemos los enfoques más conocidos para dar formato a los strings de Python:

  1. Formato de string con el operador de módulo
  2. Formato de string con el método str.format()
  3. Formato de string con in­te­r­po­la­ción de cadenas
  4. Formato de string con cadena de plantilla

Operador de módulo

Este es el formato de string más antiguo in­co­r­po­ra­do en Python y utiliza el operador de Python para los signos de po­r­ce­n­ta­je, que además se usa para hacer ope­ra­cio­nes ma­te­má­ti­cas de módulo. Por eso, este método se conoce también como formato de strings de módulo.

A co­n­ti­nua­ción, verás una tabla con cuatro variables. Los nombres no tienen im­po­r­ta­n­cia, los hemos elegido para que el código sea más fácil de entender.

Co­m­po­ne­n­te Término asignado
Plantilla de string con marcador de posición template
Operador de módulo %
Datos que se in­tro­du­ci­rán data
String con formato definido message

Primero, has de definir la plantilla como variable string con el nombre template. Dentro de la plantilla, de­te­r­mi­nas la posición del marcador con la abre­via­tu­ra %s:

template = "The total price is %s"
Python

Luego, defines el valor que quieres in­tro­du­cir como variable con el nombre data:

data = 69.51
Python

Para ejecutar el formato de string de Python, redacta la plantilla de string, seguida del operador módulo y fi­na­l­me­n­te la variable data. Asigna el string con formato a la variable message de la misma manera:

message = template % data
Python

Los datos pueden ser una variable, pero también puedes utilizar una expresión o un literal. La operación módulo puede colocarse en una única fila. He aquí un ejemplo con un string literal que se añade en lugar del marcador de posición:

message = "Here comes %s" % "Jack"
Python

Otro ejemplo: Imagina que quieres calcular la suma de distintos precios y mostrar la cantidad total en un mensaje. Has de utilizar el mismo esquema, con el que indicas que después del operador de módulo debe haber una expresión:

prices = (42, 69, 51)
message = "The total price is %s" % sum(prices)
Python

Quizá te preguntes por qué se utiliza %s como marcador en vez de si­m­ple­me­n­te el símbolo de po­r­ce­n­ta­je. Pues resulta que en esta acción, la “s” tiene un si­g­ni­fi­ca­do especial: al añadir los datos, se tra­n­s­fo­r­man en un string con la función str().

En Python, hay otras abre­via­cio­nes de formato de string que, por ejemplo, dan un formato especial a las cifras. Esto puede ilu­s­trar­se en un ejemplo con el número circular Pi. Rodea el número con el marcador de posición que ya conoces %s. La salida contiene 15 decimales:

from math import pi as PI
print("The value of Pi is approximately %s" % PI)
Python

Ahora, cambia la abre­via­ción por %g como marcador de posición y se mostrarán solo cinco decimales:

print("The value of Pi is approximately %g" % PI)
Python

Además de %s y %g, hay muchas otras opciones. Si quieres co­no­ce­r­las, consulta la siguiente sección.

Con Python también se puede dar formato al string de módulo para definir más ma­r­ca­do­res de posición y darles un si­g­ni­fi­ca­do. En ese caso, el operador módulo espera una tupla con tantos valores como ma­r­ca­do­res de posición hay. Se asignan valores a los ma­r­ca­do­res de posición:

person = ('John', 42)
message = "My friend %s is %s years old" % person
Python

Como verás, el formato de strings de Python no es es­pe­cia­l­me­n­te legible con el operador de módulo. Se vuelve un poco más fácil si se pasa un dict con los datos en vez de una tupla. Para ello, introduce los nombres de las entradas del dict entre pa­ré­n­te­sis detrás del símbolo de po­r­ce­n­ta­je del marcador de posición. De esta manera, al leer la plantilla de strings queda claro qué valores se esperan:

person = {'name': 'John', 'age': 42}
message = "My friend %(name)s is %(age)s years old" % person
Python

Método str.format()

El método de formato de cadena de Python es una evolución del formato de módulo incluido ori­gi­na­ria­me­n­te en Python 3 y tra­s­la­da­do po­s­te­rio­r­me­n­te a Python 2.6. En lugar de un operador especial, se utiliza un enfoque orientado a objetos. Así, str.format() es co­n­si­s­te­n­te con otros métodos de cadenas, como la función de Python str.split.

El esquema de base del método de Python str.format() se parece al formateo con operador de módulo y también existe de manera similar en .NET y Rust. Para marcar la posición en esta plantilla se usan corchetes, y los datos se tra­n­s­mi­ten como ar­gu­me­n­tos de la llamada a la función:

template = "Here comes {}"
data = 'Jack'
message = template.format(data)
Python

Debes pasar tantos ar­gu­me­n­tos como ma­r­ca­do­res de posición tenga la plantilla del string:

message = "My friend {} is {} years old".format('John', 42)
Python

Si lo deseas, puedes es­pe­ci­fi­car la posición de los ar­gu­me­n­tos que quieres incluir como índice. Esto permite separar el orden de los ma­r­ca­do­res de los ar­gu­me­n­tos. Ten en cuenta que el índice empieza desde el cero:

message = "My friend {1} is {0} years old".format(69, 'Jim')
Python

Siempre que los valores in­di­vi­dua­les estén en una es­tru­c­tu­ra de datos, utiliza el operador asterisco antes del argumento para des­em­pa­que­tar la es­tru­c­tu­ra de datos. Esto vale para listas y tuplas:

person = ('John', 42)
message = "My friend {} is {} years old".format(*person)
Python

En strings más largos, los ma­r­ca­do­res de posición que no dicen nada acabarán generando mucha confusión. Es mejor utilizar los ar­gu­me­n­tos con nombre:

template = "My friend {name} is {age} years old"
message = template.format(name = 'Jack', age = 51)
Python

Cuando la lista de ar­gu­me­n­tos empieza a llenarse de valores, se vuelve muy larga y por tanto poco clara, así que es mejor resumir los valores en un dict y des­em­pa­que­tar­lo llamando a la función. A di­fe­re­n­cia de lo que ocurre con las listas y las tuplas, para des­em­pa­que­tar un dict uti­li­za­mos un doble asterisco:

# define dict
person = {'name': 'Jim', 'age': 69}
# define string with placeholders
template = "My friend {name} is {age} years old"
# unpack dict in `format()` call
message = template.format(**person)
Python

El str.format() ofrece una amplia variedad de opciones de formato es­pe­cia­l­me­n­te para el de las cadenas en Python. Amplían la gama de funciones del formato módulo y son pa­r­ti­cu­la­r­me­n­te potentes para la salida de texto en la línea de comandos y para datos tabulares. A co­n­ti­nua­ción, te pre­se­n­ta­mos los distintos me­ca­ni­s­mos para dar formato a las cifras.

Python permite controlar de manera precisa la salida de texto con cifras, y definir cómo deben mostrarse los signos de los números. En el caso de los decimales, además permite indicar cuántos deben aparecer después de la coma. Esto es práctico en la re­pre­se­n­ta­ción tabular de números positivos o negativos.

Imagina que quieres dar salida a me­di­cio­nes de te­m­pe­ra­tu­ra:

samples = [('A0147D', 27.6), ('X1489M', -4.7), ('P9921U', -10.93)]
for sample in samples:
    print('| {} | {} |'.format(*sample))
Python

La salida parece en­tre­co­r­ta­da porque los números tienen lo­n­gi­tu­des di­fe­re­n­tes:

| A0147D | 27.6 |
| X1489M | -4.7 |
| P9921U | -10.93 |
Bash

Ajusta el código y define las distintas opciones de formato:

for sample in samples:
    print('| {} | {: 6.2f} |'.format(*sample))
Python

Ahora, las cifras de salida encajan:

| A0147D | 27.60 |
| X1489M | -4.70 |
| P9921U | -10.93 |
Bash

Observa las opciones de formato del segundo marcador de posición. Van después de los dos puntos y tienen cuatro co­m­po­ne­n­tes:

  1. Espacio: los números positivos van pre­ce­di­dos de un espacio para compensar el lugar que ocupa el signo de menos en los números negativos
  2. Cifra antes del punto: cantidad total de letras di­s­po­ni­bles para el número
  3. Cifra tras el punto: cantidad de decimales; rellenado con ceros si es necesario
  4. Letra “f” antes del corchete de cierre: formatea la cifra como decimal

Hay una multitud de opciones de formato con las que puede dirigirse con precisión la salida de cifras y strings. En el día a día no suelen uti­li­zar­se tanto, pero si es necesario puede co­n­su­l­tar­se la do­cu­me­n­ta­ción de formato de strings de Python.

In­te­r­po­la­ción de cadenas

La in­te­r­po­la­ción de strings está di­s­po­ni­ble como método de formato desde Python 3.6. Este enfoque, también conocido como “f strings”, es en muchos casos de apli­ca­ción el más cómodo y el que mejor rinde. Su nombre viene de la sintaxis general, los f strings empiezan con la letra “f” justo antes de las comillas de apertura.

Se usan corchetes como ma­r­ca­do­res de posición. A di­fe­re­n­cia de lo que ocurre con los métodos pre­se­n­ta­dos arriba, en este caso los ma­r­ca­do­res de posición no tienen índice ni nombre, sino la expresión que se quiera. Al definir la cadena f, los ma­r­ca­do­res de posición se rellenan au­to­má­ti­ca­me­n­te:

message = f"40 + 2 equals {40 + 2}"
Python

La expresión puede ser también el nombre de una variable:

name = 'Jack'
message = f"Here comes {name}"
Python

Puedes incluir varias ex­pre­sio­nes fá­ci­l­me­n­te:

prices = (42, 69, 51)
currency = 'EUR'
message = f"The total price is {sum(prices)} {currency}"
Python

Strings de plantilla

Además de los tres métodos pre­se­n­ta­dos, también se puede dar formato a los strings de Python con las llamadas cadenas de pla­n­ti­llas. Se crean a partir de una clase propia y protegen ante fallos de seguridad al formatear cadenas creadas por usuarios.

Las opciones de formato de los strings de plantilla son limitadas. De hecho, los ma­r­ca­do­res de posición deben contener úni­ca­me­n­te el nombre de la variable, y no la expresión que se desee. Debido a su si­m­pli­ci­dad, las cadenas de pla­n­ti­llas son muy adecuadas para in­te­r­na­cio­na­li­zar los strings que existen en varios idiomas.

El marcador de posición es un símbolo de dólar, seguido del nombre de la variable que quieres in­co­r­po­rar. La cadena de plantilla es similar a la sintaxis de lenguajes Shell como Bash o Zsh. El valor se introduce llamando al método del su­b­s­ti­tu­te():

# import `Template` class from `string` module
from string import Template
# instantiate template
template = Template("Hey there, I'm $name")
# perform substitution
message = template.substitute(name = 'Jack')
Python

Así como en los lenguajes Shell, el marcador de posición tiene otra sintaxis. Al símbolo del dólar le siguen los corchetes que contienen el nombre de la variable. Esto permite hacer su­s­ti­tu­cio­nes dentro de una palabra:

template = Template("Let's buy $amount ${fruit}s")
message = template.substitute(amount = 3, fruit = 'orange')
Python

¿Qué método conviene elegir para dar formato a un string de Python?

Recogemos las ca­ra­c­te­rí­s­ti­cas de cada método en la siguiente tabla:

Método Esquema Marcador de posición Uso
Formato módulo template % data %, %(key) Con una versión de Python < 2.6
str.format() template.format(data) {}, {index}, {key} Para formatos complejos
F string f“{ex­pre­s­sion}“ {ex­pre­s­sion} Para strings extensos
Cadena de plantilla template.su­b­s­ti­tu­te(data) ${ide­n­ti­fier} Con strings hechos por el usuario
Ir al menú principal