Trabajando con Archivos

Sitio: Facultad de Ingeniería U.Na.M.
Curso: Informática ET241/EM241/IC241/IN241/IM204
Libro: Trabajando con Archivos
Imprimido por: Invitado
Día: miércoles, 18 de diciembre de 2024, 04:55

1. Introducción.

Vamos a desarrollar en este libro a lo largo de los capítulos la manera de trabajar con Archivos en Python.

Se solicita al alumno crear con el editor de texto ( Notepad o Block de Notas en Windows o en Linux Mousepad o Gedit , etc)

Un editor de texto NO es el Word, o Write, Un editor de texto NO permite letras negritas, subrayadas, o de distintos tamaños. Solo texto plano.

Para las pruebas vamos a crear un archivo con el siguiente contenido:


Contenido del archivo:

1234567890

abcdefghijklmnopqrstuvwxyz

ABCDEFGHIJKLMNOPQRSTUVWXYZ

!"#$%&/()=?[] {}-:.,

Y lo guardamos con el Nombre del Archivo: prueba.txt , observar en que directorio o carpeta se guarda, es importante.


2. Accediendo a un archivo.

Vamos a crear un programa un Python que tenga los siguiente:

Figura 1

Este scritp USA el archivo que creamos anteriormente. Vemos que en la línea 3, se muestra que TIPO de datos es file.

Si miramos la salida de este script veremos:

Figura 2




  • La línea 2 NO muestra el archivo.txt.
  • La línea 3 muestra que el tipo file es : <class '_io.TextIOWrapper'>
Trataremos de explicar si entrar mucho en detalles.
file=open('/home/daniel/prueba.txt')  crea un objeto file, que permite manejar de manera indirecta el archivo al que hace referencia, en este caso archivo.txt.

Recordemos que el archivo físicamente se guarda en un disco rígido o en otro medios, para evitar entender todo esto, se crea un , manejador de archivos , file hande o buffer o memoria que está se asocia al archivo  en la línea:
file=open('/home/daniel/prueba.txt')

Este file handle es lo que llamamos como file en este caso, está asociado a una secuencia de caracteres que es el archivo y si lo quiero recorrer debería usar un bucle, ya veremos como hacerlo.

File Handle  es un objeto que se asocia a un archivo y tiene varios métodos.

                      


Podemos ver que este objeto llamado file en este caso, tiene varios métodos. Vamos a ver en el capítulo siguiente algunos métodos.
Otra cuestión que se observa en la Figura 2, es que si esperábamos que saliera el contenido del archivo, esto no sucedió.

Si hacemos la siguiente modificación al scritp:

La salida de este scritp sería:



Podemos ver que en este caso SI vemos el contenido del archivo!!, recordemos que  el  file handle llamado file en este caso está asociado a la secuencia de caracteres que es el archivo y el bucle recorre cada uno de los caracteres de la secuencia 

En este último script la variable "línea" del for va tomando todos y cada uno de los caractes del file handler que están asociados al archivo.txt

En la secuencia, existe un \n o nueva línea, que fue el "Enter" que presionamos al final de cada línea cuando escribimos el archivo: prueba.txt.
El \n no es un caracter imprimible, es decir no se ve, pero está  y  solo tiene un efecto que es agregar una nueva línea y ubicarse en el inicio de la misma.


3. Archivos CSV

¿Que es un archivo csv ?

Las siglas CSV vienen del inglés "Comma Separated Values" y significan valores separados por comas.

Dicho esto, un archivo CSV es cualquier archivo de texto en el cual los caracteres están separados por comas.

Uno podría preguntarse por que separarlos por coma?, bueno pensemos en que tenemos un planilla de cálculo con columnas, por ejemplo:

Figura 1

Si guardamos esto que podría ser un archivo de Calc : .ods  o de Excel: .xls o xlsx como texto debemos de alguna manera ver como indicamos la separación de cada columna, bueno la solución es separalos por columnas.

Si queremos guardalo como csv o exportarlo veremos algo como:

Figura 2

 y lo que finalmente tiene el archivo:

Figura 3



 Notemos que la primer línea se corresponde con los nombres que se le dieron a las columnas!!


Las columnas quedan definidas por comas , pero se puede elegir esto como se vé en la figura 2 punto y coma (;)

De esta manera exportando o guardando como .., se pueden crear archivos CSV con gran facilidad

Como este tipo de archivos .csv son obtenidos a partir de Tablas están asociados directamente a la creación de tablas de contenido que son elementos frecuentes que analizan los Ingenieros.

Veamos como trabajar con ellos desde Python.


3.1. Mostrando un archivo

Veremos como trabajar con un archivo que fue descargado desde una planilla de cálculo.

El archivo evaluaciones.csv, se encuentra disponible en el link, por favor descargue el archivo. Este archivo se obtuvo exportando del Moodle las evaluaciones de los alumnos de algún año pasado y se eliminaron los nombres, dejando solo los apellidos para evitar la identificación unívoca y resguardar los datos personales.

En este ejercicio, cada línea del archivo evaluaciones.csv es un string.

El archivo abierto con un editor de texto se vería:

nombre,asistencia,parcial1,parcial2,parcial3,
Acuña,86.4%,10,2,0,
Alvez,86.4%,9.87,8,7.4,
Amarilla,90.5%,8.22,9,8,
Aquino,84.0%,7.66,2.5,2.5,
Arroyo,90.5%,9.33,2.5,8,
Ayala,95.2%,7.67,5,9.7,
Ayala,91.3%,8.11,6,9.5,
Bautista,95.7%,8.98,4,3,
Benitez,87.5%,7.67,7,6,
Benitez,81.8%,7.39,5,4.5,
Benitez,90.9%,7.56,2,1,
Bitancurt,100.0%,7.06,5,6,
Bohaczenko,95.0%,8.2,4,9,
Botello,83.3%,7.33,5,2,
Briamonte,95.8%,8.11,6,2.5,

etc.etc.

El siguiente script de Python mostraría por pantalla los datos del archivo.

Figura 1

La línea 10 abre el archivo, ver que el argumento indica o debería indicar el camino o path donde se encuentra el archivo,  y si no hay error de excepción con el bucle for recorre cada línea del archivo. Las líneas serán tomadas como tipo de datos string, esto se puede ver haciendo un print(type(linea))

La salida de este script sería :

  Figura 2

y sigue.

Al hacer el ejercicio, asegurase que el archivo evaluaciones.csv y el .py estén en el mismo directorio.!!!

Notemos que la primer línea son los encabezados de cada columna:  nombre,asistencia,parcial1,parcial2,parcial3,


3.2. Formateando los datos...

Recordemos que el archivo  evaluaciones.csv tiene

  • nombre
  • porcentaje de asistencia
  • nota de parcial 1
  • nota de parcial 2
  • nota de parcial 3

Vamos a transformar el archivo en una lista para que luego podamos procesar, esto no lo vamos a hacer en aquí, pero el alumno tiene los datos para poder hacer el análisis que quiera.

Figura 1

La salida de este script sería:

Figura 2

y sigue.

¿Que pasaría si queremos ver el archivo en un formato mas lindo y saber por ejemplo cuales fueron las notas que mas se repitieron?


Consigna: Agregar el promedio de las notas de cada alumno


En este código, recorremos file, línea es una lista, con valores tomo las notas que están en la posición 2,3,4  calculo el promedio, agrego un valor a la lista y escribo allí el promedio.

La salida de este scritp sería:


Podemos ver que aparece el promedio como nuevo elemento de cada línea.

Hasta aquí esta todo bien...pero el tema sería como escribir esta lista como un archivo csv?.

Para eso vamos a utilizar una librería llamada panda y csv.

3.3. Usando csv

Vamos a usar la librería csv para escribir la lista que teníamos.

Recordemos que era una lista, donde cada lista era una línea. Lo primero que debemos hacer es importar la librería .csv

Luego a lo que ya teníamos ( del capítulo anterior ) agregamos el encabezado, eso sucede en línea 10.


Habíamos calculado el promedio de las notas, pero eso NO tenía encabezado, así que en la línea 15, creamos ese nuevo encabezado llamado : "Promedio"

En la línea 17 asociamos el flujo new_file al nuevo archivo evaluaciones_nuevo.csv en modo de escritura (mode='w' ) de write.

En la línea 18 creamos un objeto writer que usando un método de csv va a escribir en el nuevo archivo.

En la línea 19 escribimos los encabezados.

En la línea 21 y 22 recorremos cada lista de, sin tomar la de indice cero, que eran los headers y ya los incluimos. Cada lísta con indice 1... hasta la última, voy escribiendo en el archivo evaluaciones_nuevo.csv.

Si abro con una planilla de cálculo se vería:

Si bien faltarían algunas cosas, como el tema de los decimales, creo que es suficiente para entender como funciona.

Otro ejemplo con .csv

Veamos otro ejemplo, esto fue realizado por la Ing.Andrea Santanter

La idea de este punto es mostrar como leer datos desde un archivo .csv y copiarlo a una lista en python.

Si tenemos un archivo en calc con las notas de alumnos, lo guardamos como .csv, despues podemos importarlo desde python.

El archivo notas.csv esta disponible en el aula virtual

Si abre este archivo usando algún editor de texto, su contenido debería verse así.


Alumno,Nota 1,Nota 2,Nota 3

Juan,4,10,10

Pepe,10,10,3

Coco,10,9,5

Mary,2,3,4

Anibal,5,6,7

Jorge,4,5,6

Esteban,8,9,10

Monica,7,8,9

Ester,5,6,7

Python tiene un módulo incorporado llamado CSV, que tiene una clase de lectura para leer el contenido de un archivo CSV. 

El código de ejemplo para leer el CSV a una lista en Python es el siguiente.


from csv import reader
with open('notas.csv', 'r') as csv_file:
csv_reader = reader(csv_file)
    list_of_rows = list(csv_reader)
    for i in range(len(list_of_rows)):
print(list_of_rows[i])


csv_reader = reader(csv_file) pasa el archivo csv_file a la función csv.reader() y obtiene el objeto reader

Devuelve un iterador, que se utiliza para iterar sobre todas las líneas del archivo CSV.

list_of_rows = list(csv_reader) convierte el objeto csv.reader en una lista de listas, donde cada elemento de la lista significa una fila de CSV, y cada elemento de la lista representa una celda o columna de una fila.

Resultado:

['Alumno', 'Nota 1', 'Nota 2', 'Nota 3'] 

['Juan', '4', '10', '10']

['Pepe', '10', '10', '3'] 

['Coco', '10', '9', '5'] 

['Mary', '2', '3', '4'] 

['Anibal', '5', '6', '7'] 

['Jorge', '4', '5', '6'] 

['Esteban', '8', '9', '10'] 

['Monica', '7', '8', '9'] 

['Ester', '5', '6', '7']






3.4. Usando pandas

Primero de todo instalamos el módulo de pandas:

Figura 1

Es un paquete que te ayuda a trabajar con datos multidimensionales que son comunes en estadística o econometría. El nombre viene de PANel DAta Set.

Por otro lado, pandas es muy útil para manipular tablas de datos, esto con la estructura de datos que vamos a conocer como data frames.

Los dataframes tiene la particularidad de que diferentes tipos de variables pueden encajar en la misma tabla. Esto a diferencia de un array de que sólo admite un tipo de dato por conjunto de datos (suena a diccionarios o listas de Python)

Por último, pandas está construido sobre numpy lo que lo hace también súper rápido y eficiente.

Consigna

Se tiene un archivo llamado evaluaciones.csv  y se quiere procesar para calcular el promedio de los parciales y finalmente mostrar una gráfico de torta con los aprobados ( >=6) y los No aprobados (<6).

Figura 2

Vamos a usa pd para asociar el archivo evaluaciones.csv al objeto df. Luego agregamos una columna mas, llamada promedio con el método .assign completamos todas las líneas de esa columa en cero ( Promedio =0).

Para mas información de panda (https://pandas.pydata.org/) y leer la documentación sobre los métodos. También podemos recurrir a w3schools , que tiene algún ejemplo  ( https://www.w3schools.com/python/pandas/ ) .

La salida del script sería:


Vamos a calcular el promedio de las notas y guardarlo en la columna Promedio.

Si queremos saber el tipo de datos de nuevo_file:


El DataFrame es una clase de datos de Pandas, que  te permite almacenar y manipular datos tabulados en filas de observaciones y columnas de variables.

Así que veremos en la librería de panda como trabajar con ese tipo de dato Dataframe de pandas para agregar el cálculo de los promedios, hay varias maneras de crear un DataFrame, el diccionario de Python es uno de ellas.
Hay varias maneras de referencias a un elemento del  DataFrame de Pandas y operar sobre el mismo.
Una de las más sencillas es usar el nombre del objeto (punto) objeto o propiedad entre corchetes  la notación de la misma manera que hacíamos en listas.



El scritp quedaría:

Esta línea  12 asigna una nueva columna llamada Promedio. En este punto el DataFrame se llama file, sobre las columnas parcial1, parcial2 y parcial3 se hace el promedio .mean de cada fila  ( axis=1).
Todo esto se guarda en nuevo_file , que sería el nuevo DataFrame.


Ahora creamos una nueva columna, para poder poner la condición del Alumno, por el momento ponemos "Libre" a todos, para luego reemplazar donde corresponde por "Regular".

Es script quedaría:


El objeto nuevo_file invocamos el método .assign que crea una nueva columna y asigna el string "Libre" a esa columna.


Hoy hicimos referencia a la manera de acceder a elementos de un DataFrame, solo para mostrar como sería:

El método .lioc permite localizar en la columna 5 ( que es la que tiene el  promedio) de todas las filas
La salida de este print sería algo como:


No vamos a usar este tipo de referencia. Vamos a usar otra forma de recorrer las filas de la columna Condición, para escribir la condición que corresponde,  si el promedio es superior o igual a 6, escribimos "Regular" donde teníamos el string "Libre".


con el método .loc localizamos en cada fila de la columna "Promedio" las que tengan un valor de 6 o mas y reemplazamos en esa fila, en la columna "Condición" por "Regular". Se vería de la siguiente forma:

Finalmente vamos a escribir este DataFrame como archivo csv de nombre evaluaciones_nuevo.csv y usando la librería matplotlib.pyplot vamos a graficar con gráfico de torta la cantidad de Regulares y Libres.

Esta es una primer versión del scritp, se puede optimizar y mejorar, se deja al alumno investigar sobre el tema.

El gráfico ser vería:

https://sparkbyexamples.com/pandas/p