Manejo de archivos CSV con Python



@eduardo_gpg

Número de visitas 11894

Tiempo de lectura 6 min

16 Noviembre 2022

En una entrega anterior hablamos acerca de como trabajar con archivos JSON utilizando Python. Si recordamos, lo hicimos a través de diccionarios y utilizando el módulo json (Te comparto el link del post en donde lo explicamos más afondo).

Pues bien, continuando con el tema de manejo de archivos, en esta ocasión me gustaría hablaremos sobre como poder manipular archivos CSV con Python. Todo esto de forma nativa, sin la necesidad de apoyarnos de alguna librería de algún tercero como pandas.

Bien, una vez dicho todo esto, pongamos manos a la obra.

Archivos CSV

Lo primero que haremos será aprender a leer archivos .csv, para ello estaré trabajando con el siguiente archivo : users.csv. Tú por supuesto puedes utilizar el archivo que desees.

Para que podamos obtener y trabajar con el contenido de un archivo .csv lo haremos a través del módulo csv que nos ofrece Python. Este es un módulo que ya se encuentra en el biblioteca standar de Python, por lo tanto no es necesario instalar absolutamente nada.

Veamos un ejemplo.

import csv

with open('users.csv') as file:
    csv_reader = csv.reader(file, delimiter=',')

    for row in csv_reader:
        print(row)

Lo primero que haremos será abrir el archivo con el cual queremos trabajar utilizando la función open. Lo recomendable es hacerlo mediante un contexto, es por ello que utilizo la palabra reservada with.

Posterior a ello creamos una instancias de tipo reader utilizando la función reader. Pasamos como primer argumento el objeto de tipo file (un objeto iterable) y como segundo argumento, utilizando el parámetro delimiter, el carácter que delimita donde finaliza una columna. En mi caso es el carácter de coma (,). Si tu archivo csv delimita las columnas con un carácter diferente, será a través dicho parámetro que deberás definir ese caracter.

Una vez con la instancia reader ya seremos capaces de iterar sobre cada una de las filas que posee el archivo.

Aquí un ejemplo de la salida.

['name', 'age', 'username', 'email', 'country', 'postcode', 'gender']
['Ms Fátima Martin', '42', 'goldenmouse797', 'fatima.martin@example.com', 'Spain', '43746', 'female']
['Mrs Molly Garrett', '30', 'smallpanda982', 'molly.garrett@example.com', 'Ireland', '57660', 'female']
...

Perfecto, ya podemos conocer tanto las columnas como filas del archivo.

Sin embargo, en mi caso se esta imprimiendo el encabezado del archivo. Podemos visualizar el nombre de las columnas en la primer impresión (name, age, username, email, country, postcode y gender).

Por lo tanto, para únicamente imprimir en consola los valores de las columnas ( y no el nombre de las columnas) tenemos 2 formas de hacerlo.

La primera, y quizás la más intuitiva, es simplemente saltar la primer iteración. Algo como lo siguiente.

with open('users.csv') as file:

    count = 0
    csv_reader = csv.reader(file, delimiter=',')

    for row in csv_reader:
        if count != 0:
            print(row)

        count += 1

La segunda opción es apoyarnos de la función next, puesto que csv reader no es más que un iterador. Por lo tanto, podemos simplementa comenzamos a iterar sobre la segunda línea de nuestro archivo. Claro, siempre y cuando en el archivo CSV la primera línea sea el nombre de las columnas.

with open('users.csv') as file:

    csv_reader = csv.reader(file, delimiter=',')
    next(csv_reader)

    for row in csv_reader:
        print(row)

En lo particular me gusta mucho más esta forma, ya que no necesitamos de ninguna otra variable para conocer en que fila nos encontramos. Además de ellos nos evitamos condicionar.

Valores de columnas

Listo, ya conocemos el contenido de el archivo csv. Al nosotros iterar sobre cada una de las filas obtenemos como resultado una lista con cada uno de los valores de cada columna, con lo cual es posible conocer sus valores en lo individual.

Ejemplo.

    for row in csv_reader:
        name, age, username, email, *_ = row
        print(name, age, username, email)

Para este nuevo objeto únicamente obtengo los valores para name, age, username & email. Sin embargo tu puedes obtener el o los valores que desees.

Aquí otro ejemplo.

    for row in csv_reader:
        name = row[0]
        print('El username tiene por nombre', name)

En este caso, al trabajar con una lista de listas, para poder obtener el valor de columna en particular, lo haremos utilizando la posición de la columna. Recordemos entonces que los índices comienzan en 0.

Archivos CSV como diccionarios

Algo sumamente interesante del módulo csv es la capacidad de poder leer y trabajar con el contenido de un archivo csv utilizando diccionarios. Para ello reemplazaremos la función reader por la clase DictReader.

Aquí un ejemplo.

with open('users.csv') as file:
    csv_reader = csv.DictReader(file, delimiter=',')

    for row in csv_reader:
        username = row['username']
       print('El username es:', username)

Aquí ocurren 2 cosas sumamente interesantes. La primera, al nosotros crear un objeto de tipo DictReader seremos capaces de iterar sobre cada una de las filas del archivo ya no como un listado de listas, si no ahora, como un listado de diccionarios, donde cada diccionario hace referencia a una fila en particular.

Cada diccionario posee por llaves los nombre de las columnas del archivo. Y esto me lleva el segundo punto, utilizando DictReader ya no es necesario condicionar o ejecutar la función next para saltar la primera línea del archivo, puesto que DictReader toma la primera línea de dicho archivo como la fila donde se encuentran los nombres de las columnas, nombres que posteriormente se usan para crear los diccionarios.

Y lo mejor de todo es que podemos acceder a los valores que deseemos directamente por el nombre de la columna, dejando a un lado el uso de índices como lo aprendido anteriormente.

Crear archivos CSV

Perfecto, ya sabemos leer archivos csv, y, además de ello, ya podemos obtener el valor de las columnas ya sea por índices o por llaves de un diccionario, por lo tanto, para ir finalizando este post, hablemos acerca de cómo crear archivos csv.

En este caso voy a crear un nuevo archivo que me permita almacenar un listado de cursos. Para esto vamos a crea un listado de diccionarios. Dónde cada diccionario hará referencia a una fila del archivo csv.

courses = [
    { 
         'id': 1, 
         'title': 'Curso profesional de Python',  
         'description': 'Description 1' 
    } ,
    { 
          'id': 2, 
          'title': 'Curso profesional de Django', 
          'description': 'Description 2' 
    } ,
    {  
         'id': 3, 
        'title': 'Curso profesional de Base de datos', 
        'description': 'Description 3' 
    } ,
]

Para este ejemplo cada una de las sub listas posee 3 valores. Cada valor para cada una de sus columnas (Nombre del curso, id, username del tutor).

Lo siguiente que vamos a hacer es crear dicho archivo.

Primero definimos un listado con el nombre de las columnas que nuestro archivo poseerá.

columns = ['id', 'title', 'description']

Posteriormente comenzamos la escritura.

with open('courses.csv', mode='w') as file:
    writer = csv.DictWriter(file, delimiter=',', fieldnames=columns )
    writer.writeheader()

    for course in courses:
        writer.writerow(course)

Para poder escribir un archivo csv haremos uso de la clase DictWriter . Pasando como argumento el archivo donde se va a escribir, el carácter que limita donde finaliza cada una de las columnas, y como parámetro fieldnames el listado con el nombre de las columnas.

Opcionalmente, una vez instanciado el objeto, podemos generar la primera fila con el nombre de las columnas. Para esto ejecutamos el método writerheader.

Finalmente, una vez con el objeto de tipo writer simplemente ejecutamos su método writerow, pasando como argumento el diccionario que deseemos escribir.

Y listo, de esta forma tan sencilla, en menos de 10 líneas de código ya seremos capaces de crear nuevos archivos .csv

Extra

Ojo, aun que recomiendo hacer siempre uso de diccionarios para crear archivos .csv, la verdad es que no en todos los casos es posible esto. Por lo tanto, como bonus, vamos a ver la forma de crear un archivo .csv utilizando listas.

import csv

headers = ['id', 'username', 'email']
users = [
    ['1', 'user1', 'user1@pywombat.com'],
    ['2', 'user2', 'user2@pywombat.com'],
    ['3', 'user3', 'user3@pywombat.com'],
    ['4', 'user4', 'user3@pywombat.com'],
]

with open('users.csv', mode='w', newline='') as file:
    writer = csv.writer(file)
    writer.writerow( headers) # Creamos las columnas

    for user in users:
        writer.writerow(user)

Como puedes observar el código es muy sencillo, basta con usar listas para definir cada una de las filas del documento, comenzamos con el encabezado y continuamos con los datos.


¿El contenido te resulto de ayuda?

Para poder dejar tu opinión es necesario ser un usuario autenticado. Login

Vcunya

sencillo y muy útil.

Más Tips y Ejercicios 🐍

Adquiere una subscripción PyWombat por tan solo $3 USD. al mes.

Conoce los beneficios de ser usuario premium:
Niveles desbloqueados: Ten accesos a todos los niveles de ejercicios. 🔓
Nuevo límite: Incrementa tu límite de ejercicios por semana. 🚀
Contenido único: Recibe semanalmente recursos exclusivos de Python (Videos, Artículos y Capitulos del libro PyWombat, comienza como desarrollador Python. 🐍