Python string format: el formato de las cadenas en Python
Python ofrece un gran soporte para operaciones con strings y procesamiento de texto. Este lenguaje contiene una amplia variedad de opciones para el formato y la salida del texto. Te presentamos los métodos más importantes 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 documentos enteros. Los métodos para dar formato a estas cadenas son muy necesarios, pero no nos referimos a características estéticas como poner una letra en negrita en Word. ¿Qué significa el formato entonces?
Las cadenas pueden estar compuestas de distintas partes. Muchas veces se quiere combinar componentes estáticos del string con datos variables, algo necesario para dar salida a los datos y crear documentos para el desarrollo 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 conseguirlo es ensamblando el string con un operador de concatenación:
price = 69.42
message = "The total price is" + price + "EUR"
PythonDesgraciadamente, así recibirías un mensaje de error ya que el precio es un número y no puede concatenarse 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"
PythonSin embargo, esto puede volverse muy confuso. Lo mejor es definir todo el texto, incluyendo el marcador de posición, y rellenarlo con los datos. Para convertir los datos, quizá necesites ajustar su formato. Justamente 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 inconvenientes. Cada vez hay más opciones, muy parecidas en muchos aspectos pero también con algunas diferencias. Te exponemos los enfoques más conocidos para dar formato a los strings de Python:
- Formato de string con el operador de módulo
- Formato de string con el método str.format()
- Formato de string con interpolación de cadenas
- Formato de string con cadena de plantilla
Operador de módulo
Este es el formato de string más antiguo incorporado en Python y utiliza el operador de Python para los signos de porcentaje, que además se usa para hacer operaciones matemáticas de módulo. Por eso, este método se conoce también como formato de strings de módulo.
A continuación, verás una tabla con cuatro variables. Los nombres no tienen importancia, los hemos elegido para que el código sea más fácil de entender.
Componente | Término asignado |
---|---|
Plantilla de string con marcador de posición | template |
Operador de módulo | % |
Datos que se introducirán | data |
String con formato definido | message |
Primero, has de definir la plantilla como variable string con el nombre template. Dentro de la plantilla, determinas la posición del marcador con la abreviatura %s:
template = "The total price is %s"
PythonLuego, defines el valor que quieres introducir como variable con el nombre data:
data = 69.51
PythonPara ejecutar el formato de string de Python, redacta la plantilla de string, seguida del operador módulo y finalmente la variable data. Asigna el string con formato a la variable message de la misma manera:
message = template % data
PythonLos 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"
PythonOtro 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)
PythonQuizá te preguntes por qué se utiliza %s como marcador en vez de simplemente el símbolo de porcentaje. Pues resulta que en esta acción, la “s” tiene un significado especial: al añadir los datos, se transforman en un string con la función str().
En Python, hay otras abreviaciones de formato de string que, por ejemplo, dan un formato especial a las cifras. Esto puede ilustrarse 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)
PythonAhora, cambia la abreviación por %g como marcador de posición y se mostrarán solo cinco decimales:
print("The value of Pi is approximately %g" % PI)
PythonAdemás de %s y %g, hay muchas otras opciones. Si quieres conocerlas, consulta la siguiente sección.
Con Python también se puede dar formato al string de módulo para definir más marcadores de posición y darles un significado. En ese caso, el operador módulo espera una tupla con tantos valores como marcadores de posición hay. Se asignan valores a los marcadores de posición:
person = ('John', 42)
message = "My friend %s is %s years old" % person
PythonComo verás, el formato de strings de Python no es especialmente 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 paréntesis detrás del símbolo de porcentaje 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
PythonMétodo str.format()
El método de formato de cadena de Python es una evolución del formato de módulo incluido originariamente en Python 3 y trasladado posteriormente a Python 2.6. En lugar de un operador especial, se utiliza un enfoque orientado a objetos. Así, str.format() es consistente 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 transmiten como argumentos de la llamada a la función:
template = "Here comes {}"
data = 'Jack'
message = template.format(data)
PythonDebes pasar tantos argumentos como marcadores de posición tenga la plantilla del string:
message = "My friend {} is {} years old".format('John', 42)
PythonSi lo deseas, puedes especificar la posición de los argumentos que quieres incluir como índice. Esto permite separar el orden de los marcadores de los argumentos. Ten en cuenta que el índice empieza desde el cero:
message = "My friend {1} is {0} years old".format(69, 'Jim')
PythonSiempre que los valores individuales estén en una estructura de datos, utiliza el operador asterisco antes del argumento para desempaquetar la estructura de datos. Esto vale para listas y tuplas:
person = ('John', 42)
message = "My friend {} is {} years old".format(*person)
PythonEn strings más largos, los marcadores de posición que no dicen nada acabarán generando mucha confusión. Es mejor utilizar los argumentos con nombre:
template = "My friend {name} is {age} years old"
message = template.format(name = 'Jack', age = 51)
PythonCuando la lista de argumentos 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 desempaquetarlo llamando a la función. A diferencia de lo que ocurre con las listas y las tuplas, para desempaquetar un dict utilizamos un doble asterisco:
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)
PythonEl str.format() ofrece una amplia variedad de opciones de formato especialmente para el de las cadenas en Python. Amplían la gama de funciones del formato módulo y son particularmente potentes para la salida de texto en la línea de comandos y para datos tabulares. A continuación, te presentamos los distintos mecanismos 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 representación tabular de números positivos o negativos.
Imagina que quieres dar salida a mediciones de temperatura:
samples = [('A0147D', 27.6), ('X1489M', -4.7), ('P9921U', -10.93)]
for sample in samples:
print('| {} | {} |'.format(*sample))
PythonLa salida parece entrecortada porque los números tienen longitudes diferentes:
| A0147D | 27.6 |
| X1489M | -4.7 |
| P9921U | -10.93 |
BashAjusta el código y define las distintas opciones de formato:
for sample in samples:
print('| {} | {: 6.2f} |'.format(*sample))
PythonAhora, las cifras de salida encajan:
| A0147D | 27.60 |
| X1489M | -4.70 |
| P9921U | -10.93 |
BashObserva las opciones de formato del segundo marcador de posición. Van después de los dos puntos y tienen cuatro componentes:
- Espacio: los números positivos van precedidos de un espacio para compensar el lugar que ocupa el signo de menos en los números negativos
- Cifra antes del punto: cantidad total de letras disponibles para el número
- Cifra tras el punto: cantidad de decimales; rellenado con ceros si es necesario
- 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 utilizarse tanto, pero si es necesario puede consultarse la documentación de formato de strings de Python.
Interpolación de cadenas
La interpolación de strings está disponible como método de formato desde Python 3.6. Este enfoque, también conocido como “f strings”, es en muchos casos de aplicació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 marcadores de posición. A diferencia de lo que ocurre con los métodos presentados arriba, en este caso los marcadores de posición no tienen índice ni nombre, sino la expresión que se quiera. Al definir la cadena f, los marcadores de posición se rellenan automáticamente:
message = f"40 + 2 equals {40 + 2}"
PythonLa expresión puede ser también el nombre de una variable:
name = 'Jack'
message = f"Here comes {name}"
PythonPuedes incluir varias expresiones fácilmente:
prices = (42, 69, 51)
currency = 'EUR'
message = f"The total price is {sum(prices)} {currency}"
PythonStrings de plantilla
Además de los tres métodos presentados, también se puede dar formato a los strings de Python con las llamadas cadenas de plantillas. 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 marcadores de posición deben contener únicamente el nombre de la variable, y no la expresión que se desee. Debido a su simplicidad, las cadenas de plantillas son muy adecuadas para internacionalizar 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 incorporar. 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 substitute():
# 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')
PythonAsí 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 sustituciones 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 características 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“{expression}“ | {expression} | Para strings extensos |
Cadena de plantilla | template.substitute(data) | ${identifier} | Con strings hechos por el usuario |