Crear fichero de datos csv e ir añadiendo información – Pandas

publicado por: Anonymous

Mi objetivo es analizar una serie de imágenes e ir sacando información y guardándola en fichero de extensión csv.

Para ello lo primero que quiero hacer es crear el fichero vacío, simplemente con sus columnas y luego a medida que vaya obteniendo datos ir rellenándolo.

Para crear el csv lo hago con esta función:

def data_csv(carpetas):

    for arch in carpetas:
        print(arch)
        datos = {'nombre_archivo': [],
                 'dia': [],
                 'mes': [],
                 'ano': [],
                 'hora': [],
                 'minuto': [],
                 'segundo': []}
        columns = ['nombre_archivo', 'dia', 'mes', 'ano', 'hora', 'minuto', 'segundo']
        df = pd.DataFrame(datos, columns=columns)
        df.to_csv('datos.csv')

Una vez ya existe el fichero quiero ir rellenándolo.

datos = [nombre_fichero, split[2], split[1], split[4], hora[0], hora[1], hora[2]]
columns = ['nombre_archivo', 'dia', 'mes', 'ano', 'hora', 'minuto', 'segundo']
df = pd.DataFrame(datos, columns=columns)
df.to_csv('datos.csv', mode='a')

Esto último está fatal, pero no se me ocurre cómo hacerlo.La idea es obtener los datos, guardarlos em un dataframe y después añadirlo al fichero que previamente se ha creado.

solución

En principio yo crearía un diccionario para cada elemento que procesas, e iría recopilando todos esos diccionarios en una lista.

Por ejemplo, ya que no sé muy bien de dónde vienen tus datos, supongamos que una función llamada obtener_datos() te devuelve una tupla con la información necesaria sobre un archivo. El siguiente código llamaría en bucle a esa función para diferentes archivos e iría acumulando los resultados en una lista de diccionarios como la que te propongo:

lista_total = []
for archivo in lista_de_archivos:
    data = obtener_datos(archivo)
    lista_total.append({
        'nombre_archivo': data[0],
        'dia': data[1],
        'mes': data[2],
        'ano': data[3],
        'hora': data[4],
        'minuto': data[5],
        'segundo': data[6]
    })

Ahora puedes convertir esa lista en un dataframe y volcarlo:

df = pd.DataFrame(lista_total, columns=columns)
df.to_csv('datos.csv')

Dices que más adelante querrías aumentar la lista con más datos y añadirlos al csv. No me queda claro cómo abordarías el caso de los elementos que ya estaban allí.

Es decir, supongo que la iteración que haces sobre lista_archivos probablemente use os.listdir() o similares para obtener los nombres de archivo en una carpeta. ¿Se añadirán ficheros nuevos a esa carpeta sin borrar los que había? ¿O una vez ejecutado tu script se borrarán todos los ficheros de esa carpeta y la próxima vez que se ejecute todos serán nuevos?

Si es la primera opción, basta ejecutar de nuevo el mismo script, pues volverá a crear un dataframe con todos los ficheros, lo que incluye a los que ya había de la otra vez. El csv se actualizaría automáticamente.

Si es la segunda opción, puedes abrir el fichero .csv en modo append y pasarle el fichero ya abierto a pandas, y decirle que no vuelque los nombres de las columnas (mediante header=False). Entiendo que hay que tener cuidado con que los nombres de las columnas no varíen.

Este sería el esquema:

with open('datos.csv', 'a') as f:
    df.to_csv(f, header=False)
Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *