Aprende leyendo en orden

json y csv — E/S de datos estructurados

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?
JSONcomún en APIs webpares clave/valorse permite anidarCSVcomún en análisis de datos1 fila = 1 registroabre en hojas de cálculorasgosrasgos
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.loads
objeto Pythondict / list / str / numjson.dumpscadena JSON{ "name": "Ana" }cadena JSON{ "name": "Ana" }json.loadsobjeto Pythondict / list / str / numescribirleer
Fila 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ónFunciónNotas
json.dumps(obj)Python → cadena JSONdevuelve un str
json.loads(text)cadena JSON → Pythondevuelve un dict / list / etc.
json.dump(obj, file)Python → escribir a archivopasar la f de open()
json.load(file)archivo → Pythonpasar la f de open()
indent=Nformato legible con sangría de N espaciospara lectores humanos
ensure_ascii=Falseemitir no-ASCII tal cualpor 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.reader
lista de valores["Ana", 30]csv.writerwriterowtexto CSVAna,30csv.readerfor row in readerlista de valores['Ana', '30'] (todo str)escribirleer
writer.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 útiles
lista de dicts[{name: ..., age: ...}]DictWriterwriteheader+ writerowsCSV con encabezadoname,ageAna,30DictReaderfor row in readerlista de dictsacceso row["name"]escribirleer
DictWriter 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?