Conversión bidireccional con json.dumps / loads y ensure_ascii, posición con csv.writer / reader, y acceso por nombre de columna con DictWriter / DictReader, hasta agregar datos del Titanic.
Este artículo cubre la E/S de dos formatos de datos estructurados comunes — json, muy usado por las APIs web, y csv, que se abre limpiamente en hojas de cálculo.
JSON vs CSV — ¿Cuándo usar cuál?JSON puede expresar pares clave/valor y estructuras anidadas, así que aparece en respuestas de APIs web y archivos de configuración. CSV es un formato plano de "una fila = un registro" que se abre directamente en hojas de cálculo como Excel, lo que lo hace estándar en análisis de datos.
json — Conversión bidireccional entre objetos Python y cadenas JSON
JSON (JavaScript Object Notation) es un formato de texto ligero que expresa estructura solo con "pares clave/valor" y "listas ordenadas", usado como estándar para respuestas de APIs web y archivos de configuración. El módulo json de Python convierte dicts, lists, cadenas, números, bool y None desde y hacia JSON.
Dos funciones básicas son suficientes para recordar. json.dumps(objeto) convierte Python → cadena JSON, y json.loads(cadena) convierte cadena JSON → Python. La s final viene de string — las distingue de dump / load, que trabajan directamente con archivos.
Simetría de json.dumps y json.loadsFila superior: dumps (dump string) = la dirección Python → cadena JSON. Fila inferior: loads (load string) = la dirección cadena JSON → Python. Las variantes sin la s (dump / load) trabajan directamente con objetos de archivo.
Función
Función
Notas
json.dumps(obj)
Python → cadena JSON
devuelve un str
json.loads(text)
cadena JSON → Python
devuelve un dict / list / etc.
json.dump(obj, file)
Python → escribir a archivo
pasar la f de open()
json.load(file)
archivo → Python
pasar la f de open()
indent=N
formato legible con sangría de N espacios
para lectores humanos
ensure_ascii=False
emitir no-ASCII tal cual
por defecto los escapa
ensure_ascii por defecto es True
Por defecto, json.dumps({"name": "café"}) produce '{"name": "caf\u00e9"}' — los caracteres no-ASCII se escapan como \u. Es técnicamente válido, pero difícil de leer para humanos e infla el tamaño del archivo, así que para datos con caracteres no-ASCII (acentos, emoji, CJK, etc.), acostúmbrate a pasar ensure_ascii=False.
Convierte la información del usuario a JSON, parséala de vuelta a un objeto Python y comprueba el tipo de cada variable con type().
① Importa el módulo json.
② Construye un diccionario con name="Ana" y una lista de items ["Apple", "Banana"] (dos claves: name e items).
③ Convierte el dict a una cadena JSON con sangría (legible) e imprímela, luego imprime type(text): para mostrar el tipo de la cadena JSON (desactiva el escape de no-ASCII por si los datos contienen acentos, emoji, etc.).
④ Parsea la cadena JSON de vuelta a un objeto Python, e imprime type(parsed): y type(items): de cada uno (extrae items desde parsed).
⑤ Del objeto parseado, imprime nombre: ◯◯ y Primer artículo: ◯◯ (el primer elemento de items).
(Si lo ejecutas correctamente, aparecerá una explicación.)
Editor Python
Ejecutar el código para ver el resultado
Bases de csv — Manejar filas con reader y writer
CSV (Comma-Separated Values) es un formato plano donde una línea separada por comas equivale a un registro, y como las hojas de cálculo como Excel pueden abrirlo directamente, está por todos lados en flujos de trabajo empresariales. El módulo csv de Python ofrece funciones para leer y escribir este formato fila a fila.
Las bases son csv.writer(file) y csv.reader(file): el primero escribe una lista de valores como una fila, el segundo lee CSV una fila a la vez como una lista de valores. Dos puntos a tener en cuenta: primero, todo lo que leas vuelve como cadena — si necesitas enteros, conviértelos con int() tú mismo. Segundo, siempre pasa newline='' a open(...) para que el módulo csv pueda manejar él mismo los caracteres de salto de línea.
Qué hacen csv.writer y csv.readerwriter.writerow(lista)escribe una lista de valores como una fila CSV. reader hace lo inverso — extrae una fila CSV como lista de valores — y, sobre todo, todos los valores salen como cadenas.
Siempre pasa newline='' a open
El módulo csv maneja los caracteres de salto de línea por sí mismo, así que necesitas pasar newline='' como en open("x.csv", "w", newline=''). Si te lo saltas, puedes acabar con CSV con filas en blanco en Windows — un clásico tropiezo señalado en la documentación oficial de Python.
Escribe una lista de usuarios a CSV y luego léela fila a fila usando un archivo output.csv en el sistema de archivos del navegador (VFS).
① Importa el módulo csv.
② Abre output.csv en modo escritura (con newline=''), construye un writer y escribe 3 filas: un encabezado ["name", "age"] y dos filas de datos ["Ana", 30] y ["Carlos", 25].
③ Reabre el mismo archivo en modo lectura (con newline=''), construye un reader e imprime las filas una a una con for row in reader:.
Editor Python
Ejecutar el código para ver el resultado
DictWriter y DictReader — Leer y escribir por nombre de columna
Los csv.writer / reader de la sección anterior trabajan por posición, así que añadir columnas o cambiar su orden te obliga a reescribir cada acceso row[0] / row[1]. DictWriter / DictReader son versiones que leen y escriben por nombre de columna (encabezado) — puedes escribir una lista de dicts directamente a CSV y leerla de vuelta como una lista de dicts.
Los datos del mundo real son en su mayoría CSV con fila de encabezado, así que en proyectos reales recurrirás a estos mucho más a menudo.
Por qué DictWriter / DictReader son útilesDictWriter convierte una lista de dicts en un CSV con una fila de encabezado definida por fieldnames. DictReader hace lo inverso — lee un CSV con fila de encabezado como lista de dicts, así puedes acceder a los valores por nombre de columna como row["name"].
Escribe una lista de dicts de usuarios a users.csv, luego léela de vuelta e imprime cada fila formateada. Intenta leer por nombre de columna en lugar de por posición.
① Importa csv.
② Construye una lista de dos usuarios (3 columnas: name / age / city).
- Primero: name="Ana", age=30, city="Tokyo"
- Segundo: name="Carlos", age=25, city="Osaka"
③ Abre users.csv en modo escritura, construye un DictWriter y escribe el encabezado + filas de datos (pasa fieldnames=["name", "age", "city"]).
④ Reabre el archivo y construye un DictReader, e imprime cada fila con el formato {name} ({age} años) {city}.
Editor Python
Ejecutar el código para ver el resultado
Ejemplo del mundo real: Agregar titanic.csv
Hasta ahora hemos construido datasets pequeños en código y los hemos escrito. Cerremos leyendo un dataset real y agregando. El sujeto es el famoso dataset Titanic de Kaggle (891 filas / 12 columnas), con columnas como PassengerId / Survived (0 = murió, 1 = sobrevivió) / Pclass (clase de cabina) / Name / Sex / Age / Fare.
El python_console de la práctica precarga el CSV externo en el sistema de archivos virtual del navegador (VFS) vía fileUrls, así que tu código solo tiene que llamar a open("titanic.csv"). Escribiremos la misma tarea con csv.reader (posicional) y csv.DictReader (por nombre de columna).
Usa el csv.reader posicional para leer titanic.csv y contar el total de pasajeros y sobrevivientes.
① Importa el módulo csv.
② Abre titanic.csv en modo lectura (con newline='') y construye un reader.
③ Salta la fila de encabezado con next(reader).
④ Recorre el resto con for row in reader: y cuenta total y survived (filas donde la columna Survived = índice 1 es "1").
⑤ Imprime Total: 891 y Sobrevivientes: 342.
Editor Python
Ejecutar el código para ver el resultado
Usa el csv.DictReader basado en nombres de columna para leer titanic.csv y calcular la media de la columna Age. Los datos del Titanic tienen filas donde Age está en blanco, así que también lo manejaremos.
① Importa csv.
② Abre titanic.csv en modo lectura (con newline='') y construye un DictReader.
③ En el bucle, toma row["Age"] de cada fila y recoge solo las no vacías con float(row["Age"]) en una lista.
④ Imprime el conteo de filas válidas y la edad promedio (2 decimales) así:
- Registros válidos: ◯ (esperado: 714)
- Edad promedio: ◯◯.◯◯ (esperado: 29.70)
Editor Python
Ejecutar el código para ver el resultado
QUIZ
Verificación de conocimientos
Responde cada pregunta una a una.
Pregunta 1¿Qué incluye json.dumps({"name": "café"}, ensure_ascii=False) en su salida?
Pregunta 2¿Cuál es el tipo de los valores devueltos al leer filas con csv.reader?
Pregunta 3¿Qué es lo más adecuado para leer un CSV con fila de encabezado como lista de dicts?