es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Utilizando atexit() para exportar un dataframe de Pandas a CSV al salir de la aplicación: atexit() imprime la declaración de impresión una vez por cada fila en el dataframe.

Estoy utilizando Flask, Python y Pandas para guardar los resultados de las solicitudes HTTP entrantes en un dataframe de Pandas. Estoy utilizando atexit() con el dataframe como parámetro para que, cuando se cierre la aplicación, pueda exportarlo a un archivo CSV.

def onExitApp(dataframe):
    dataframe.to_csv('redacted.csv')
    print('App Exited')

Lo estoy registrando después de que se haya creado el dataframe de esta manera:

atexit.register(onExitApp, dataframe=df)

He usado este mismo código antes en otras aplicaciones y la instrucción print solo se ejecutaba una vez cuando se cerraba la aplicación. Sin embargo, cuando cierro esta aplicación, estoy obteniendo App Exited impreso en la consola una vez por cada fila en el dataframe. He estado buscando ejemplos que contengan este problema, pero no estoy encontrando nada. ¿Estoy pasando por alto algo obvio o ha cambiado algo en atexit que pueda provocar esto? Gracias de antemano por cualquier sugerencia.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema puede no estar relacionado con atexit() en sí, sino más bien con la forma en que se llama a la función onExitApp(). Es posible que la función se llame varias veces, lo que provoca que la declaración print se ejecute varias veces también.

    Una posible solución es agregar una bandera o variable a la función que controle si ya se ha ejecutado. Por ejemplo:

    def onExitApp(dataframe):
        if not onExitApp.ejecutado:
            dataframe.to_csv('redacted.csv')
            print('Aplicación cerrada')
            onExitApp.ejecutado = True
    
    onExitApp.ejecutado = False
    

    Esto asegura que la función se ejecute solo una vez, independientemente de cuántas veces se llame.

    Otra posible solución es utilizar un método diferente para exportar el dataframe a CSV, como utilizar el método to_csv() incorporado de pandas fuera de la función onExitApp(). Por ejemplo:

    import atexit
    import pandas as pd
    
    datos_app = pd.DataFrame()
    
    # Función para manejar la exportación del dataframe
    def exportar_a_csv():
        datos_app.to_csv('redacted.csv')
        print('Aplicación cerrada')
    
    # Registrar la función con atexit
    atexit.register(exportar_a_csv)
    
    # Función para manejar las solicitudes HTTP entrantes y agregar datos al dataframe
    def manejar_solicitud_http(nuevos_datos):
        # procesar los datos
        datos_app = datos_app.append(nuevos_datos)
    
    # Ejecutar la aplicación y manejar las solicitudes entrantes
    

    Esto separa la funcionalidad de exportación de la función onExitApp(), lo que puede ayudar a evitar posibles problemas con atexit().

Comments are closed.