Jsonconverter / app.py
IkerVillanueva's picture
Upload app.py
b013d85 verified
import gradio as gr
import json
import pandas as pd
import os
import zipfile
import re
def procesar_conversaciones(archivo_json):
# Crear carpeta temporal para almacenar archivos JSON individuales
carpeta_salida = "conversaciones"
os.makedirs(carpeta_salida, exist_ok=True)
# Procesar el archivo JSON
with open(archivo_json.name, 'r', encoding='utf-8') as file:
data = json.load(file)
archivos_creados = []
nombres_existentes = set() # Para rastrear nombres duplicados
for idx, conversation in enumerate(data['conversations']):
# Filtrar mensajes del 'user' y obtener el contenido del primer mensaje
primer_mensaje = next((msg['content'] for msg in conversation['messages'] if msg['role'] == 'user'), None)
if primer_mensaje:
# Limpiar el nombre para evitar caracteres inválidos
nombre_archivo_base = re.sub(r'[<>:"/\\|?*]', '_', primer_mensaje[:50]) # Limitar longitud a 50 caracteres
nombre_archivo = nombre_archivo_base
# Asegurarse de que el nombre sea único
if nombre_archivo in nombres_existentes:
nombre_archivo = f"{nombre_archivo_base}_{idx}"
nombres_existentes.add(nombre_archivo)
nombre_archivo = os.path.join(carpeta_salida, f"{nombre_archivo}.json")
else:
# Si no hay mensaje del 'user', usamos el ID como último recurso
nombre_archivo = os.path.join(carpeta_salida, f"{conversation['id']}.json")
# Crear DataFrame de mensajes
df = pd.DataFrame(conversation['messages'])[['role', 'content']]
df['role'] = df['role'].replace({'assistant': 'paciente', 'user': 'fisioterapeuta'})
# Guardar el DataFrame como JSON con el nombre ajustado
df.to_json(nombre_archivo, orient='records', force_ascii=False, indent=2)
archivos_creados.append(nombre_archivo)
# Crear el archivo ZIP
zip_path = "conversaciones_separadas.zip"
with zipfile.ZipFile(zip_path, 'w') as zipf:
for archivo in archivos_creados:
zipf.write(archivo, os.path.basename(archivo))
return zip_path
# Interfaz de Gradio sin `share=True`
if __name__ == "__main__":
interfaz = gr.Interface(
fn=procesar_conversaciones,
inputs=gr.File(label="Sube el archivo JSON"),
outputs=gr.File(label="Descargar ZIP")
)
interfaz.launch()