Capítulo 1: Comencemos Nuestro Viaje de Automatización
Parte 2: Formateo y Manipulación de Cadenas
Una de las habilidades básicas al tratar con la creación de texto y documentos es poder formatear correctamente los valores en cadenas estructuradas. Python es inteligente al presentar buenos valores predeterminados, pero hay muchas opciones y posibilidades que exploraremos.
Crear Cadenas con Valores Formateados
La herramienta principal para formatear cadenas en Python es el método format. Funciona con un mini-lenguaje definido para renderizar variables:
result = template.format(*parameters)
Ejemplos Básicos
>>> 'Pon el valor aquí: {}'.format('STRING') "Pon el valor aquí: STRING" >>> 'Cualquier tipo ({}) y más de uno ({})'.format(1.23, 'STRING') "Cualquier tipo (1.23) y más de uno (STRING)" >>> 'Especifica el orden: {1}, {0}'.format('primero', 'segundo') 'Especifica el orden: segundo, primero' >>> 'Nombra parámetros: {first}, {second}'.format(second='SEGUNDO', first='PRIMERO') 'Nombra parámetros: PRIMERO, SEGUNDO'
Cómo Hacerlo - Tabla Alineada
Vamos a crear un script que imprima una tabla alineada con formato profesional:
# DATOS DE ENTRADA data = [ (1000, 10), (2000, 17), (2500, 170), (2500, -170), ] # Imprime el encabezado print('INGRESOS | GANANCIA | PORCENTAJE') # Plantilla con formato TEMPLATE = '{revenue:>7,} | {profit:>+6} | {percent:>7.2%}' # Imprime las filas for revenue, profit in data: row = TEMPLATE.format(revenue=revenue, profit=profit, percent=profit / revenue) print(row)
1,000 | +10 | 1.00%
2,000 | +17 | 0.85%
2,500 | +170 | 6.80%
2,500 | -170 | -6.80%
Cómo Funciona
La constante TEMPLATE define tres columnas con especificaciones de formato:
{revenue:>7,}— Ancho 7, alineado a la derecha, separador de miles{profit:>+6}— Ancho 6, alineado a la derecha, signo + para positivos{percent:>7.2%}— Ancho 7, 2 decimales, formato porcentaje
F-Strings (Python 3.6+)
Una característica más moderna son los f-strings que permiten formateo inline:
>>> param1 = 'primero' >>> param2 = 'segundo' >>> f'Parámetros {param1}:{param2}' 'Parámetros primero:segundo' # Para incluir llaves literales, duplicarlas: >>> value = 'VALOR' >>> f'Entre llaves {{{value}}}' 'Entre llaves {VALOR}'
Manipular Cadenas
Cuando se trabaja con texto, a menudo es necesario manipularlo y procesarlo: unirlo, dividirlo en fragmentos, o cambiarlo a mayúsculas o minúsculas.
Ejemplo Práctico
Transformemos un informe: redactar números, formatear a 80 caracteres por línea, convertir a ASCII y capitalizar como título.
AFTER THE CLOSE OF THE SECOND QUARTER, OUR COMPANY, CASTAÑACORP
HAS ACHIEVED A GROWTH IN THE REVENUE OF 7.47%. THIS IS IN LINE
WITH THE OBJECTIVES FOR THE YEAR...
Paso a Paso
1. Dividir en palabras:
>>> words = INPUT_TEXT.split()
2. Reemplazar dígitos con 'X':
>>> redacted = [''.join('X' if w.isdigit() else w for w in word) for word in words]
3. Transformar a ASCII puro:
>>> ascii_text = [word.encode('ascii', errors='replace').decode('ascii') for word in redacted]
4. Agrupar en líneas de 80 caracteres:
>>> LINE_SIZE = 80 >>> lines = [] >>> line = '' >>> for word in newlines: ... if line.endswith('\n') or len(line) + len(word) + 1 > LINE_SIZE: ... lines.append(line) ... line = '' ... line = line + ' ' + word
5. Formatear como título y unir:
>>> lines = [line.title() for line in lines] >>> result = '\n'.join(lines)
Métodos Útiles de Cadenas
string[0:2]— Slicing: "word"[0:2] retorna "wo".splitlines()— Separar por caracteres de nueva línea.upper()/.lower()— Convertir a mayúsculas/minúsculas.replace(old, new)— Reemplazar subcadenas.strip()— Eliminar espacios al inicio y final
.replace()! Puede generar reemplazos inesperados. Por ejemplo: 'bring'.replace('ring', 'necklace') produce 'bnecklace'.
Para ajustar líneas de texto automáticamente, puedes usar el módulo textwrap de la biblioteca estándar:
import textwrap wrapped = textwrap.fill(text, width=80)