Archivos INI: El Estándar de Configuración que No Pasa de Moda
Los archivos INI llevan más de cuatro décadas en uso activo. Popularizados por Microsoft Windows en los años 80, sobrevivieron la llegada de XML, JSON y YAML para seguir siendo la opción favorita en miles de aplicaciones, juegos, herramientas de línea de comandos y sistemas embebidos. La razón es simple: texto plano, sin esquemas obligatorios, sin instalación de parsers, legible por cualquier humano.
Estructura de un Archivo INI
El formato INI define cuatro elementos:
Secciones agrupan configuraciones relacionadas bajo un encabezado entre corchetes:
[base_de_datos]
host = localhost
puerto = 5432
nombre = miapp
Pares clave-valor usan = o : como separador según el parser. Los espacios alrededor del separador se ignoran normalmente:
tiempo_espera = 30
max_conexiones=100
reintento_delay : 5
Comentarios empiezan con ; (tradición Windows) o # (convención Unix):
; Comentario estilo Windows
# Comentario estilo Unix
host = localhost ; algunos parsers admiten comentarios inline
Claves globales (antes de cualquier sección) caen en un espacio de nombres implícito por defecto.
Lo que el Formato NO Define
El INI no tiene una especificación RFC única y oficial. Los parsers difieren en:
- Si los nombres de clave son sensibles a mayúsculas (
Host≠host) - Valores multilínea — algunos parsers usan barra invertida de continuación, otros usan sangría
- Cadenas entre comillas —
nombre = "Juan García"puede o no eliminar las comillas - Valores booleanos —
true/false,yes/no,1/0,on/offson todos válidos en diferentes sistemas - Secciones anidadas —
[sección.subsección]no está soportado universalmente
Esta flexibilidad hace al INI portable pero exige conocer el dialecto del parser concreto.
Soporte por Plataforma y Lenguaje
Windows: La API Win32 incluye GetPrivateProfileString() / WritePrivateProfileString(). El propio Windows usó win.ini y system.ini durante décadas, y las aplicaciones siguen almacenando configuración en %APPDATA%.
Python: El módulo configparser de la biblioteca estándar lee INI de forma nativa con soporte para secciones, valores de respaldo, interpolación (%(clave)s) y valores multilínea:
import configparser
config = configparser.ConfigParser()
config.read('configuracion.ini')
host_db = config['base_de_datos']['host']
puerto = config.getint('base_de_datos', 'puerto')
PHP: La función parse_ini_file() es nativa y devuelve un array asociativo anidado. El modo INI_SCANNER_TYPED convierte booleanos e integers automáticamente.
.NET: Microsoft.Extensions.Configuration acepta archivos INI con AddIniFile() en aplicaciones ASP.NET Core modernas.
Linux/Unix: Las aplicaciones de escritorio GNOME (GLib GKeyFile) y KDE (KConfig) usan formato similar a INI para su configuración.
Casos de Uso Habituales
Configuración de aplicaciones: Credenciales de base de datos, URLs de API, flags de funcionalidad, preferencias de interfaz — todo lo que debe ser configurable sin recompilar.
Videojuegos: Configuración gráfica, mapeo de teclas, ajustes de dificultad. El motor Unreal Engine usa jerarquías extensas de INI (BaseGame.ini, DefaultEngine.ini, sobrescrituras por plataforma).
Herramientas de desarrollo: pytest usa pytest.ini o una sección [pytest] en setup.cfg. Flake8 lee .flake8 o setup.cfg. MySQL arranca leyendo my.cnf o my.ini.
Localización: Aplicaciones antiguas almacenan cadenas de traducción como pares clave-valor INI, un archivo por idioma.
Conversión de Archivos INI
INI a JSON: Útil para integraciones con APIs o frontends JavaScript. Las secciones INI se convierten en objetos JSON anidados:
{
"base_de_datos": {"host": "localhost", "puerto": "5432"},
"cache": {"driver": "redis", "ttl": "3600"}
}
INI a TOML: TOML es el sucesor moderno con tipado. La estructura se mapea casi directamente — TOML añade tipos, arrays y tablas inline. Herramientas como ini2toml automatizan la migración.
INI a YAML: YAML permite anidamiento más profundo y valores tipados. Los pipelines de DevOps suelen preferir YAML para configuración de infraestructura.
Mezcla de múltiples INI: Python's configparser.read([...]) combina varios archivos, con los posteriores sobrescribiendo los anteriores — patrón ideal para jerarquías globales → usuario → entorno.
Seguridad
Los archivos INI con credenciales nunca deben añadirse al control de versiones. Prácticas recomendadas:
- Añadir
*.inio el archivo concreto al.gitignore - Usar sustitución de variables de entorno cuando el parser lo soporte
- Establecer permisos restrictivos:
chmod 600 config.inien sistemas Unix - Para secretos críticos, usar gestores de secretos dedicados en lugar de hardcodear en archivos
INI vs. Alternativas Modernas
| Característica | INI | TOML | YAML | JSON |
|---|---|---|---|---|
| Legible por humanos | ✅ | ✅ | ✅ | Moderado |
| Valores tipados | ❌ (solo strings) | ✅ | ✅ | ✅ |
| Comentarios | ✅ | ✅ | ✅ | ❌ |
| Arrays | Limitado | ✅ | ✅ | ✅ |
| Anidamiento profundo | ❌ | ✅ | ✅ | ✅ |
| Especificación oficial | ❌ | ✅ | ✅ | ✅ |
INI gana en simplicidad y ubicuidad. Para datos estructurados jerárquicos, TOML o YAML ofrecen mayor riqueza semántica.
Consejos Prácticos
- Usa un parser real en lugar de dividir por
=manualmente. Los casos límite (valores entre comillas, comentarios inline, continuación multilínea) rompen implementaciones ingenuas. - Documenta tu dialecto en un comentario al inicio del archivo — indica qué biblioteca lo lee y qué características de sintaxis soporta.
- Mantén las secciones planas — la jerarquía de un solo nivel de INI es una ventaja. Si necesitas anidamiento profundo, considera TOML o YAML.
- Valida al cargar — comprueba que las claves requeridas existen y recurre a valores por defecto documentados en lugar de usar cadenas vacías silenciosamente.
- Versiona el formato de config — añade
version = 2para que la aplicación pueda gestionar migraciones de formato.
Con más de 40 años de historia, los archivos INI siguen siendo una elección excelente para configuración simple, editable por humanos, donde un fichero de texto de 80 caracteres supera a un esquema XML o una dependencia de parser YAML.
Conversiones relacionadas
Conversiones frecuentes del catálogo: