Manejo de Archivos JSON en Python para Aplicaciones Web y APIs
Resumen
¿Cómo leer archivos JSON en Python?
JSON, que significa JavaScript Object Notation, es un formato liviano de intercambio de datos. Es crucial para trabajar con datos en aplicaciones web y APIs. Aprender a manejarlo con Python es esencial para desarrolladores que buscan eficiencia y flexibilidad.
Para leer un archivo JSON en Python, sigue estos sencillos pasos:
Importar la librería JSON: Primeramente, debes importar el módulo JSON de Python.
import json
Abrir el archivo JSON: Utiliza la función open para acceder al archivo. Asegúrate de especificar el modo de lectura.
Ejecutar y verificar: Tras ejecutar el código, verifica que el nuevo producto se haya añadido correctamente al archivo JSON.
Manipular archivos JSON es una habilidad poderosa y esencial para cualquier desarrollador. Te permite conservar la estructura y legibilidad del archivo mientras gestionas información de manera eficaz. Además, la práctica constante y el aprendizaje con ejercicios adicionales, como convertir archivos entre CSV y JSON, potenciarán tus habilidades en el manejo de datos. ¡Sigue aprendiendo y ampliando tus conocimientos!
Buenas tardes, a estas alturas del curso, creo que uno llega con la energía de reserva, empezó bien y entendible pero a medida que avanzó se fue tornando ladrilludo y monótono, no tanto por los temas en sí, sino por la forma de transmitirlos, la persona a cargo del curso no está explicando los conceptos, está contando lo que está haciendo y es muy diferente explicar a contar, ya que cuando te cuentan algo, siempre quedan dudas y muchos vacíos del origen de las cosas. Y más en estos cursos que se requiere tanta explicación. Por favor si pudieran manejar una metodología más de enfoque educativo, seria mejor para próximas ocasiones. gracias.
Completamente de acuerdo
Amigo, en esta parte o altura del curso (lectura de archivo .txt, csv, json, etc) no hay tanto que explicar como al inicio cuando se ve métodos, funciones, variables donde hay más razonamiento lógico. Simplemente se aplican las funciones propias de cada libreria como sacadas dentro de la manga. Si ves el curso de Curso de Python: Comprehensions, Funciones y Manejo de Errores o demás cursos de python en la web verás lo que te estoy diciendo.
Me gustaría que dieran una clase estructurada con teoría y ejemplos, porque desde que entramos a POO nos pusieron ejercicios sin tener las bases del conocimiento y esto hace más difícil que se cree lógica y coherencia, al menos en mi caso.
He visto que muchos quedaron perdidos con POO, te recomiendo que uses IA para entender mejor y también busca otros videos así sea en youtube, te darás cuenta que no es tan difícil como parece.
¡Ánimo!
hello folks
Les comparto mi código, la verdad hice un poco de trampa porque le pregunte a chat GPT por como pasar un archivo csv a formato json con python y viceversa, así que me dio el código para los dos casos.
# Este programa toma un archivo csv y crea un nuevo archivo json modificado
# luego a portir del joson modificado se crea un nuevo archivo csv
import csv, json
old_csv_file ='products_updated.csv'new_json_fle ='newproducts_json.json'new_csv_file ='newproducts_csv.csv'new_product ={"name":"Bluetooth Speaker","price":"120","quantity":"40","brand":"SoundVibes","category":"Audio","entry_date":"2024-07-20","total_value":"4800.0"}# 1. pasar del archivo csv a un nuevo archivo json ---------------------------------
# abrir archivo csv
withopen(old_csv_file, mode='r')ascsvFile: csv_reader = csv.DictReader(csvFile)
# convertir las filas a una lista de diccionarios
filas =list(csv_reader)# Guardar en un archivo JSONwithopen(new_json_fle, mode='w')asnewJsonFile: json.dump(filas, newJsonFile, indent=4) pass
# 2. modificar el nuevo archivo json -------------------------------------------------withopen(new_json_fle, mode='r')asnewJsonFile: products = json.load(newJsonFile)
# añadimos el nuevo producto la lista de productos
products.append(new_product)
# esribimos las modificaciones en el archivo json
withopen(new_json_fle, mode='w')asnewJsonFile: json.dump(products, newJsonFile, indent=4) pass
# 3. pasar el archivo json a un nuevo archivo csv --------------------------------------withopen(new_json_fle, mode='r')asjsonFile: products = json.load(jsonFile)withopen(new_csv_file, mode='w', newline='')ascsvFile: csv_writer = csv.DictWriter(csvFile, fieldnames=products[0].keys()) csv_writer.writeheader() csv_writer.writerows(products)
pass
Hola! no hiciste trampa :) apoyarnos de la AI es un excelente recurso para saldar dudas :D
Con un poco de ayuda de tu código, realicé este:
file_path_csv ="products.csv"file_path_csv_to_json ="products_csv_to_json.json"withopen(file_path_csv, mode="r")ascsvfile: csv_reader = csv.DictReader(csvfile) #aqui se lee el archivo csv
filds =list(csv_reader) #aqui se convierte el archivo csv a una lista de diccionarios
withopen(file_path_csv_to_json, mode="w")asjsonfile: #aqui se guarda el archivo csv en un archivo json
json.dump(filds, jsonfile, indent=4) #aqui se convierte el archivo csv a un archivo json
file_path_json ="products.json"file_path_json_to_csv ="products_json_to_csv.csv"withopen(file_path_json, mode="r")asjsonfile: products = json.load(jsonfile) #aqui se lee el archivo json
withopen(file_path_json_to_csv, mode="w", newline="")ascsvfile: #aqui se guarda el archivo json en un archivo csv
csv_writer = csv.DictWriter(csvfile, fieldnames=products[0].keys()) #aqui se convierte el archivo json a un archivo csv
csv_writer.writeheader() #aqui se escribe la cabecera del archivo csv
csv_writer.writerows(products) #aqui se escribe los datos del archivo csv
Se que aqui se estan dando pasos de gigante de tema en tema, para esos como yo que estan sufriendo en saltar temas, les recomiendo agarrar el codigo de la clase cuyo tema sea dificil y ponerse a buscar que significa cada termino o como funciona, y luego aplicar lo que enseñan en clase para absorber bien lo investigado, entiendo la frustración de muchos al no entender lo que se muestra, pero no se rindan.
El trabajo del programador tambien es de indigar en los temas que no conocemos.
Gran aporte.
Estuve desarrollando un script en Python que, iba a un programada de afiliados mendiante un API, y verificaba al momento mas de 1000 Tokens (Al API teniamos accesso por ser clientes de esa plataforma) entonces podiamos ir manualmente o mediante la API: Yo cree ese script y el API devolvia los datos en JSON, de forma que el mismo Script era capaz de decodificar el JSON y crearme un reporte o en CSV o en XLSX con toda la informacion descargada de la plataforma.
El equipo antes se tardaba 3 horas diarias, con este desarrollo ahora se tardan 2 minutos.
Codigo de CSV a JSONimport csvimport json
file_csv='products.csv'new_json_file='new_json.json'
data=[]
with open(file_csv,'r') as fileCSV: csvreader=csv.DictReader(fileCSV) for row in csvreader: data.append(row)
with open(new_json_file,mode='w') as file: json.dump(data,file,indent=4)
no se entiende, en cuál de todos los archivos lo estás agregando, ni a qué hora creaste eso, deberías explicar mejor, en vez de estar haciendo clases rápidas, que al final los alumnos no van a comprender, y yo siendo programador hago esta queja, no me imagino a alguien que sea completamente nuevo en esto
import json
import csv
file_path ='file_json.json'file_csv ='file.csv'withopen(file_path, mode='r')asfile: motos = json.load(file)withopen(file.csv, mode='w', newline='')asfile: csv_writer = csv.DictWriter(file, fieldnames=motos[0].keys()) csv_writer.writeheader() csv_writer.writerows(motos)```**BONUS 🚀:***En el código uso la parte del codigo* ```python
fieldnames=motos[0].keys()```*el cual hace referencia a que las columnas serán las claves del diccionario en el i \[0] de la lista del json*
""" JSON → CSV
json.load() para leer el JSON
csv.DictWriter() para crear el archivo CSV
writeheader() y writerows() para escribir los datos
✅ CSV → JSON
csv.DictReader() para leer el CSV
list() para convertirlo en una lista de diccionarios
json.dump() para guardarlo en un JSON"""
import json
import csv
#Lectura Json
with open('products.json', 'r') as file:
products_1=json.load(file)
print(products_1)
# Obtener los nombres de las columnas (keys)
keys = products_1[0].keys()
# Crear el archivo CSV
with open("csv_productos.csv", "w", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=keys)
writer.writeheader() # escribir encabezados
writer.writerows(products_1) # escribir filas
print("Archivo CSV creado correctamente.")
# Lista para almacenar los datos
data = []
# Leer el archivo CSV
with open("csv_productos.csv", "r", encoding="utf-8") as f:
reader = csv.DictReader(f)
for row in reader:
# Opcional: convertir tipos (porque todo viene como string)
"""row["price"] = int(row["price"])
row["quantity"] = int(row["quantity"])"""
data.append(row)
# Guardar como JSON
with open("productos_json.json", "w", encoding="utf-8") as f:
json.dump(data, f, indent=4, ensure_ascii=False)
print("Archivo JSON creado correctamente.")
En la clase anterior me costó un poco aprender porque cometí un error de principiante. Al trabajar con archivos JSON, pensé que había guardado el archivo antes de ejecutarlo, pero en realidad no lo había hecho. Por esa razón, el programa no se ejecutaba correctamente y aparecía un error. Este detalle me ayudó a entender la importancia de guardar siempre los cambios en los archivos antes de ejecutarlos desde la terminal. Comparto esta experiencia por si le sirve a alguien más, ya que este punto también aplica a la clase anterior y a cualquier práctica futura.
#escribe un programa que covierta un archivo csv en json y un json en csv:
import csv
import json
path_json ='D:\\Curso_Python\\txt\\products.json'path_csv_converted ='D:\\Curso_Python\\txt\\products_json.csv'path_csv ='D:\\Curso_Python\\txt\\products.csv'path_json_converted ='D:\\Curso_Python\\txt\\products_csv.json'#De.json a .csvwithopen(path_json,mode ='r')asjson_file: products = json.load(json_file)#print(products) #Capturo el primer elemento de mi json
columns_view = products[0] #extraigo el nombre de las llaves mediante "#$%%.keys()" columns_list =list(columns_view.keys())print(columns_list)withopen(path_csv_converted, mode ='w', newline='')asnew_file: csv_writer = csv.DictWriter(new_file,columns_list) csv_writer.writeheader() csv_writer.writerows(products)#De.csv a .jsonwithopen(path_csv,mode ='r', newline='')ascsv_file: #leo los datos del csv
products_csv = csv.DictReader(csv_file) columns = products_csv.fieldnames #capturo las columnas para volverlas llaves
datos_json =list(products_csv) #Convierto los datos a listas(Dar formato correcto)#print(columns) #escribo el archivo Jsonwithopen(path_json_converted,mode ='w')asnew_file: json.dump(datos_json,new_file, indent =4)
Mi aporte al ejecicio de conversion de archivos csv <==> json
Buen día, comparto mi aporte del ejercicio, inicialmente realice la conversión usando lo explicado por la profesora, luego de indagar veo que la librería pandas facilita bastante la lectura y conversión de este tipo de archivos:
# convert json a csv usando PANDAS
import pandas as pd
with open('Muestras/products.json', mode='r') as input:
file_path_csv ="products.csv"file_path_csv_to_json ="products_csv_to_json.json"withopen(file_path_csv, mode="r")as csvfile: csv_reader = csv.DictReader(csvfile)#aqui se lee el archivo csv filds =list(csv_reader)#aqui se convierte el archivo csv a una lista de diccionarioswithopen(file_path_csv_to_json, mode="w")as jsonfile:#aqui se guarda el archivo csv en un archivo json json.dump(filds, jsonfile, indent=4)#aqui se convierte el archivo csv a un archivo jsonfile_path_json ="products.json"file_path_json_to_csv ="products_json_to_csv.csv"withopen(file_path_json, mode="r")as jsonfile: products = json.load(jsonfile)#aqui se lee el archivo jsonwithopen(file_path_json_to_csv, mode="w", newline="")as csvfile:#aqui se guarda el archivo json en un archivo csv csv_writer = csv.DictWriter(csvfile, fieldnames=products[0].keys())#aqui se convierte el archivo json a un archivo csv csv_writer.writeheader()#aqui se escribe la cabecera del archivo csv csv_writer.writerows(products)#aqui se escribe los datos del archivo csv
se nota que eres alguien con mucha experiencia, gracias por tu apoter, con pocas lineas de codigos y super eficiente.
Que opinan de mi solución.
CSV A JSON
JSON A CSV
Aquí dejo mi aporte por favor antes de finalizar, felicitaciones estimada profe.
#Convert csv to jsonimport <u>csv</u>, <u>json</u>
#Convertidor de csv a jsonwith open('products.csv', mode='r') as file: reader = <u>csv</u>.<u>DictReader</u>(file) products = [row for row in reader] with open('new_convert_products.json', mode='w') as file: <u>json</u>.dump(products, file, indent=4)
#Convertidor de json a csvwith open('new_convert_products.json', mode='r') as file: products = <u>json</u>.load(file) with open('new_convert_products.csv', mode='w') as file: writer = <u>csv</u>.<u>DictWriter</u>(file, fieldnames=['name', 'price', 'quantity', 'brand', 'category', 'entry_date']) writer.writeheader() for product in products: writer.writerow(product)
import json
import csv
encabezado =["timestamp","tag","tipo_sensor","ubicacion","valor","unidad","corriente_ma","estado","alarma_alta","alarma_baja","modo_operacion"]registros =[{"timestamp":"2026-06-01 06:00","tag":"TT-101","tipo_sensor":"PT100","ubicacion":"Reactor_A","valor":25.3,"unidad":"°C","corriente_ma":8.1,"estado":"normal","alarma_alta":85.0,"alarma_baja":5.0,"modo_operacion":"automatico"},{"timestamp":"2026-06-01 06:05","tag":"TT-101","tipo_sensor":"PT100","ubicacion":"Reactor_A","valor":26.1,"unidad":"°C","corriente_ma":8.4,"estado":"normal","alarma_alta":85.0,"alarma_baja":5.0,"modo_operacion":"automatico"},{"timestamp":"2026-06-01 06:10","tag":"TT-101","tipo_sensor":"PT100","ubicacion":"Reactor_A","valor":45.8,"unidad":"°C","corriente_ma":12.7,"estado":"normal","alarma_alta":85.0,"alarma_baja":5.0,"modo_operacion":"automatico"},{"timestamp":"2026-06-01 06:15","tag":"TT-101","tipo_sensor":"PT100","ubicacion":"Reactor_A","valor":67.3,"unidad":"°C","corriente_ma":15.3,"estado":"normal","alarma_alta":85.0,"alarma_baja":5.0,"modo_operacion":"automatico"},{"timestamp":"2026-06-01 06:20","tag":"TT-101","tipo_sensor":"PT100","ubicacion":"Reactor_A","valor":88.5,"unidad":"°C","corriente_ma":18.1,"estado":"alarma","alarma_alta":85.0,"alarma_baja":5.0,"modo_operacion":"automatico"},{"timestamp":"2026-06-01 06:25","tag":"TT-101","tipo_sensor":"PT100","ubicacion":"Reactor_A","valor":91.2,"unidad":"°C","corriente_ma":18.7,"estado":"alarma","alarma_alta":85.0,"alarma_baja":5.0,"modo_operacion":"manual"},{"timestamp":"2026-06-01 06:30","tag":"TT-101","tipo_sensor":"PT100","ubicacion":"Reactor_A","valor":72.4,"unidad":"°C","corriente_ma":16.0,"estado":"normal","alarma_alta":85.0,"alarma_baja":5.0,"modo_operacion":"manual"},{"timestamp":"2026-06-01 06:00","tag":"PT-201","tipo_sensor":"Piezo","ubicacion":"Tanque_B","valor":150.7,"unidad":"psi","corriente_ma":12.0,"estado":"normal","alarma_alta":250.0,"alarma_baja":10.0,"modo_operacion":"automatico"},{"timestamp":"2026-06-01 06:05","tag":"PT-201","tipo_sensor":"Piezo","ubicacion":"Tanque_B","valor":155.2,"unidad":"psi","corriente_ma":12.3,"estado":"normal","alarma_alta":250.0,"alarma_baja":10.0,"modo_operacion":"automatico"},{"timestamp":"2026-06-01 06:10","tag":"PT-201","tipo_sensor":"Piezo","ubicacion":"Tanque_B","valor":189.4,"unidad":"psi","corriente_ma":14.5,"estado":"normal","alarma_alta":250.0,"alarma_baja":10.0,"modo_operacion":"automatico"},{"timestamp":"2026-06-01 06:15","tag":"PT-201","tipo_sensor":"Piezo","ubicacion":"Tanque_B","valor":230.1,"unidad":"psi","corriente_ma":17.1,"estado":"normal","alarma_alta":250.0,"alarma_baja":10.0,"modo_operacion":"automatico"},{"timestamp":"2026-06-01 06:20","tag":"PT-201","tipo_sensor":"Piezo","ubicacion":"Tanque_B","valor":261.8,"unidad":"psi","corriente_ma":18.7,"estado":"alarma","alarma_alta":250.0,"alarma_baja":10.0,"modo_operacion":"automatico"},{"timestamp":"2026-06-01 06:25","tag":"PT-201","tipo_sensor":"Piezo","ubicacion":"Tanque_B","valor":245.3,"unidad":"psi","corriente_ma":17.8,"estado":"normal","alarma_alta":250.0,"alarma_baja":10.0,"modo_operacion":"automatico"},{"timestamp":"2026-06-01 06:30","tag":"PT-201","tipo_sensor":"Piezo","ubicacion":"Tanque_B","valor":198.6,"unidad":"psi","corriente_ma":15.1,"estado":"normal","alarma_alta":250.0,"alarma_baja":10.0,"modo_operacion":"automatico"},{"timestamp":"2026-06-01 06:00","tag":"LT-301","tipo_sensor":"Ultrasonico","ubicacion":"Tanque_C","valor":3.2,"unidad":"m","corriente_ma":6.1,"estado":"normal","alarma_alta":8.0,"alarma_baja":0.5,"modo_operacion":"automatico"},{"timestamp":"2026-06-01 06:05","tag":"LT-301","tipo_sensor":"Ultrasonico","ubicacion":"Tanque_C","valor":3.5,"unidad":"m","corriente_ma":6.4,"estado":"normal","alarma_alta":8.0,"alarma_baja":0.5,"modo_operacion":"automatico"},{"timestamp":"2026-06-01 06:10","tag":"LT-301","tipo_sensor":"Ultrasonico","ubicacion":"Tanque_C","valor":4.1,"unidad":"m","corriente_ma":7.0,"estado":"normal","alarma_alta":8.0,"alarma_baja":0.5,"modo_operacion":"automatico"},{"timestamp":"2026-06-01 06:15","tag":"LT-301","tipo_sensor":"Ultrasonico","ubicacion":"Tanque_C","valor":5.8,"unidad":"m","corriente_ma":8.4,"estado":"normal","alarma_alta":8.0,"alarma_baja":0.5,"modo_operacion":"automatico"},{"timestamp":"2026-06-01 06:20","tag":"LT-301","tipo_sensor":"Ultrasonico","ubicacion":"Tanque_C","valor":7.9,"unidad":"m","corriente_ma":10.9,"estado":"normal","alarma_alta":8.0,"alarma_baja":0.5,"modo_operacion":"automatico"},{"timestamp":"2026-06-01 06:25","tag":"LT-301","tipo_sensor":"Ultrasonico","ubicacion":"Tanque_C","valor":8.4,"unidad":"m","corriente_ma":11.4,"estado":"alarma","alarma_alta":8.0,"alarma_baja":0.5,"modo_operacion":"manual"},{"timestamp":"2026-06-01 06:30","tag":"LT-301","tipo_sensor":"Ultrasonico","ubicacion":"Tanque_C","valor":6.1,"unidad":"m","corriente_ma":8.7,"estado":"normal","alarma_alta":8.0,"alarma_baja":0.5,"modo_operacion":"manual"},{"timestamp":"2026-06-01 06:00","tag":"FT-401","tipo_sensor":"Coriolis","ubicacion":"Linea_D","valor":120.5,"unidad":"L/min","corriente_ma":13.7,"estado":"normal","alarma_alta":200.0,"alarma_baja":20.0,"modo_operacion":"automatico"},{"timestamp":"2026-06-01 06:05","tag":"FT-401","tipo_sensor":"Coriolis","ubicacion":"Linea_D","valor":118.3,"unidad":"L/min","corriente_ma":13.5,"estado":"normal","alarma_alta":200.0,"alarma_baja":20.0,"modo_operacion":"automatico"},{"timestamp":"2026-06-01 06:10","tag":"FT-401","tipo_sensor":"Coriolis","ubicacion":"Linea_D","valor":95.7,"unidad":"L/min","corriente_ma":11.6,"estado":"normal","alarma_alta":200.0,"alarma_baja":20.0,"modo_operacion":"automatico"},{"timestamp":"2026-06-01 06:15","tag":"FT-401","tipo_sensor":"Coriolis","ubicacion":"Linea_D","valor":42.1,"unidad":"L/min","corriente_ma":7.4,"estado":"normal","alarma_alta":200.0,"alarma_baja":20.0,"modo_operacion":"automatico"},{"timestamp":"2026-06-01 06:20","tag":"FT-401","tipo_sensor":"Coriolis","ubicacion":"Linea_D","valor":15.8,"unidad":"L/min","corriente_ma":5.0,"estado":"alarma","alarma_alta":200.0,"alarma_baja":20.0,"modo_operacion":"automatico"},{"timestamp":"2026-06-01 06:25","tag":"FT-401","tipo_sensor":"Coriolis","ubicacion":"Linea_D","valor":18.3,"unidad":"L/min","corriente_ma":5.2,"estado":"alarma","alarma_alta":200.0,"alarma_baja":20.0,"modo_operacion":"manual"},{"timestamp":"2026-06-01 06:30","tag":"FT-401","tipo_sensor":"Coriolis","ubicacion":"Linea_D","valor":85.4,"unidad":"L/min","corriente_ma":10.8,"estado":"normal","alarma_alta":200.0,"alarma_baja":20.0,"modo_operacion":"manual"},]withopen("registro_planta.csv", mode="w", newline="")as archivo: escritor = csv.DictWriter(archivo, fieldnames=encabezado) escritor.writeheader()for registro in registros: escritor.writerow(registro)withopen("registro_planta.csv", mode="r", newline="")as archivo: lector = csv.DictReader(archivo) datos =[] datos_1 =[] count_1 =0 count_2 =0 count_3 =0 count_4 =0for registro in lector: datos.append(registro)if registro['estado']=="alarma": count_1 +=1if registro['tag']=="TT-101": count_2 +=float(registro['valor']) count_3 +=1iffloat(registro['corriente_ma'])> count_4: count_4 =float(registro['corriente_ma']) datos_1 =[registro['tag']]# limpiar y empezar de nuevoeliffloat(registro['corriente_ma'])== count_4: datos_1.append(registro['tag'])# empate, agregarprint(f"Total de registros en alarma: {count_1}")print(f"Promedio de temperatura del TT-101: {(count_2/count_3):.2f}°C")print(f"sensores cuya corriente es maxima: {datos_1}")withopen("registro_planta.json", mode="w")asfile: json.dump(datos,file, indent=4) fieldnames =[]withopen("registro_planta.json", mode="r")asfile: datos = json.load(file) fieldnames =list(datos[0].keys())withopen("registro_restaurado.csv", mode="w", newline="")as archivo: escritor = csv.DictWriter(archivo, fieldnames=fieldnames) escritor.writeheader()for dato in datos: escritor.writerow(dato)withopen("registro_planta.csv", mode="r", newline="")as archivo: lector = csv.DictReader(archivo) datos_2 =[]for fila in lector: datos_2.append(fila)primeros_3 = datos_2[:3]print(primeros_3)withopen("registro_restaurado.csv", mode="r", newline="")asfile: lector = csv.DictReader(file) datos_3 =[]for fila in lector: datos_3.append(fila)primeros_3_modificado = datos_3[:3]print(primeros_3_modificado)if primeros_3 == primeros_3_modificado:print(f"\n!!!Los datos son iguales!!!")
Como estorban esos "retos" a media clase, quitan totalmente la concentración