Escuelita Python

Taller teórico/práctico dictado todos los miércoles sobre introducción a Python.

Escuelita de iniciación a Python

python.jpeg

Presentación del curso aquí.

Leyendo archivos .csv

Documentación oficial: https://docs.python.org/3/library/csv.html

Los archivos con extensión csv son las típicas hojas de cálculo que manipulan programas como LibreOffice Calc o Microsoft Excel.

Estos archivos contienen datos separados por comas (csv viene del inglés comma separated values, que significa justamente eso) y por saltos de líneas (los enters al final de cada línea).

En Python se usa el módulo csv para leer y escribir estos archivos.

Como cualquier otro módulo de Python debemos importarlo antes de usarlo; en este caso usando la instrucción import csv (se recomienda siempre poner todas las importaciones de un programa al comienzo del mismo).

Dentro del módulo csv las funciones usadas para leer y escribir archivos csv son csv.reader y csv.writer respectivamente.

Estas funciones tienen un solo parámetro obligatorio que es un archivo, previamente abierto usando la función open. Por cuestiones de compatibilidad debemos abrir el archivo pasando el parámetro newline='' (principalmente para leer archivos provenientes de Windows).

Preparándonos para leer:

import csv
archivo_csv = open("datos.csv", newline='')
reader = csv.reader(archivo_csv)

A partir de acá tenemos el archivo datos.csv, que tiene que residir en la misma carpeta que el script, listo para ser leído usando un for.

En cada iteración del for una línea entera va a ser cargada como una lista, con la cantidad de elementos igual a la cantidad de campos de esa misma línea.

print("Contando campos por línea:")
for linea in reader:
	print(f"Línea con {len(linea)} campos.")

Recordemos que la función len aplicada a listas nos devuelve la cantidad de elementos que posee.

Para acceder al valor de los campos se usa el acceso por índice, igual que con cualquier otra lista. Solo si estamos 100% seguros de que cada línea del archivo contiene N campos podemos acceder directamente a ellos sin hacer ninguna verificación previa de si existen o no. En este caso estamos en presencia de una tabla, y entonces las líneas las llamamos filas y los campos columnas:

Para un archivo donde el tercer campo es siempre una fecha:

print("Mostrando columna fecha:")
for fila in reader:
	print(fila[2])

Notar que como los índices de las listas comienzan en 0, el tercer campo se traduce al índice número 2.

Una salvedad que hay que tener al leer archivos csv es que los valores son siempre leídos como strings. Por ende, para hacer operaciones matemáticas con los valores de una columna numérica debemos previamente convertirlas al tipo numérico de Python. Para enteros se usa la función int y para decimales float.

Supongamos un archivo donde está cargado en la primer columna la cantidad de casas (entero) y en la segunda el total de sus superficies (decimal) por barrio de una localidad:

total_casas = 0
total_superficies = 0
for fila in reader:
	total_casas += int(fila[0])
	total_superficies += float(fila[1])
print(f"La localidad tiene {total_casas} casas, sumando una superficie de {total_superficies} m2")

Hacer esto es bastante inseguro (propenso a errores). Ya que si llega a venir una columna vacía o mal cargada el programa se rompería. Por eso, siempre es conveniente hacer todas las verificaciones posibles.

Reformulando el for anterior:

for fila in reader:
	casas = fila[0]
	if casas.isnumeric():
		total_casas += int(casas)
	else:
		print(f"Cuidado, una fila tiene cantidad de casas inválida: {casas}")
        
	superficies = fila[1]
	try:
		superficies_f = float(superficies)
	except ValueError:
		print(f"Cuidado, una fila tiene el campo superficies inválido: {superficies}")
	else:
		total_superficies += superficies_f

(El código del try continúa por el else solo cuando no hubieron errores, sino salta al except.)

Esto parecería funcionar a priori. Pero para nosotres argentines se nos complica: solemos usar como separador decimal la coma, y no el punto, como Python espera. Entonces, si nuestro archivo tiene números con la coma como separador decimal debemos remplazarlo por punto antes de pasárselo a la función float.

En ese caso, habría que corregir la línea superficies = fila[1] por superficies = fila[1].replace(',', '.').

El script final queda:

import csv

archivo_csv = open("datos.csv", newline='')

reader = csv.reader(archivo_csv)

for fila in reader:
	casas = fila[0]
	if casas.isnumeric():
		total_casas += int(casas)
	else:
		print(f"Cuidado, una fila tiene cantidad de casas inválida: {casas}")
        
	superficies = fila[1].replace(',', '.')
	try:
		superficies_f = float(superficies)
	except ValueError:
		print(f"Cuidado, una fila tiene el campo superficies inválido: {superficies}")
	else:
		total_superficies += superficies_f
        
print(f"La localidad tiene {total_casas} casas, sumando una superficie de {total_superficies} m2")

Existe otra forma de leer archivos csv que es usando csv.DictReader.

Esta función al igual que csv.reader tiene un único parámetro obligatorio que es el archivo. El objeto que devuelve lo recorremos también con un for.

La diferencia está en que por defecto esta función interpreta la primer línea como los encabezados de las columnas (headers en inglés). Así, el for comienza realmente en la segunda línea del archivo, que es donde empiezan los datos, y vamos a poder acceder a las columnas usando los nombres de los encabezados. Es decir las líneas ya no son leídas como listas, sino como diccionarios (que son básicamente como las listas pero con índices no estrictamente númericos).

Veámoslo.

Imaginemos un archivo donde la primer fila contiene nombre,edad y el resto de las filas sus datos correspondientes. Haríamos entonces:

import csv
archivo_csv = open("datos.csv", newline='')
reader = csv.DictReader(archivo_csv)
for fila in reader:
	print(f"La persona {fila['nombre']} tiene {fila['edad']} año(s)")

¡Mucho más cómodo!

Les dejo otro tuto, con más detalles, en inglés: https://realpython.com/python-csv/#reading-csv-files-into-a-dictionary-with-csv

^D

Instalando Python

La instalación de Python dependerá de qué sistema operativo uses.

Antes de instalarlo primero chequeá que no lo tengás ya instalado:

Verificar si ya lo tenés

Linux o Mac

Si tenés Linux o Mac tal vez ya tengas Python instalado. Abrí una terminal y fijate si el comando python -V funciona. Si funciona verificá que te haya devuelto la versión 3.6.x o mayor. Si es menor, probá con el comando python3 -V. Si lograste encontrar un Python de la versión requerida podés saltar directo al final, si no seguí a la sección de instalar.

Windows

Buscá "python" en el menú inicio a ver si aparece algo. También chequeá en Archivos de programa y Archivos de programa (x86) (o sus equivalente en inglés) a ver si tienen dentro una carpeta "Python" o similar. Si ya lo tenés instalado podés saltar a la última sección para instalar un editor de código, si no, continuá con el siguiente punto.

Instalar Python

Linux

Lo más probable es que tengas Python instalado. Asegurate de chequearlo. Si no, podemos usar el package manager de tu distro para instalarlo desde la terminal. Por ejemplo en Ubuntu, o cualquier distro derivada de Debian, hay que hacer sudo apt install python3

Mac

Podemos hacer desde la consola brew install python. Si no tenés brew instalado podés seguir las instrucciones, en inglés, acá.

Windows

Si tenemos Windows vamos a la página oficial, hacemos click en el botón grande de Download, y vamos al final de la página donde se encuentra el listado de archivos y elegimos Windows x86-64 executable installer si tenemos un sistema de 64bits (que es lo más probable), si no elegimos la versión x86 . Una vez abierto el instalador, chequear la cajita Add Python to PATH. Además, elegir la opción Customize installation y seleccionar todas las Optional features. Si no pudiste, probá con este tuto (en inglés).

Instalar un editor de código

Si bien se puede usar un simple editor de texto como Gedit, Mousepad, o Notepad, es preferible tener un editor mejorado, preparado para programar, por más mínimo que sea.

En este sentido podés usar Geany que es bastante liviano. Desde Linux lo instalamos con el package manager, en Ubuntu sudo apt install geany. Desde Mac o Windows seguimos las instrucciones de su página web.

Una vez instalado debemos cambiar una configuración. Abrimos Geany y vamos al menú Build, a la opción Set Build Commands. Dentro de la ventana de configuración, vamos a cambiar el campo del final, Execute, que ya tiene algo adentro parecido a ./%e. Si estamos en Linux o Mac lo cambiamos por python %e o python3 %e (mirar la primera sección de esta página si no sabés cuál). Si estamos en Windows ponemos la ruta completa de python.exe más el %e al final, por ejemplo C:\Archivos de programa\Python\python.exe %e (chequear primero que esta sea una ubicación válida)

Para probar si anda, escribir en el editor print("Hola mundo"), apretar F5, guardar el script en donde sea, y debería abrirse una terminal que diga arriba del todo Hola mundo.

¡Y bienvenide al mundo pythonístico!

Utilidades

La idea de este documento es recolectar las utilidades, librerías, binarios, etc., que se comparten en el Lab, en sus espacios físicos y digitales, y sirvan para el desarrollo de aplicaciones python más creativas y eficientes.

Redes
Otros

Libros/tutos Python

La idea de esta página es recopilar libros o tutoriales de Python en español.

Para organizar mejor el contenido, cada ítem que se agregue debe contar con una pequeña reseña contando un poco qué contiene el libro/tuto así facilitamos la búsqueda de material idoneo para lo que cada une busque.


Libros