Trabajando con ficheros csv usando el módulo csv de Python

Dentro de la biblioteca estándar tenemos un módulo que sirve para leer ficheros csv. Este módulo no es escesivamente útil si usamos numpy o pandas pero como no siempre disponemos de estos módulos está bien que le echemos un vistazo.

Primero de todo, ¿qué es un fichero con formato csv? En principio, es un fichero tabular de texto con diferentes columnas separadas por comas. Leer más sobre esto aquí.

Vamos a empezar importando el módulo y vemos lo que nos proporciona:

Lo anterior nos mostrará:

Hay dos nombres que parecen evidentes, reader y writer. Luego hay otras cosas que iremos viendo poco a poco.

La ayuda para reader y writer dice lo siguiente:

csv.reader sirve para leer ficheros en formato csv y csv.writer sirve para escribir ficheros en formato csv. Vemos que para ambas opciones existe una keyword que se llama dialect. Dentro del módulo tenemos varios dialects definidos:

Lo anterior me muestra en pantalla:

De serie a mi me salen tres dialectos distintos.

Pero, ¿qué es esto de un dialecto?

Vamos a ver en qué se basa un dialect.

Lo anterior mostrará esto:

Un dialecto contiene formas de definir cómo será el fichero en formato csv que hemos de leer o que hemos de escribir. Por ejemplo, el dialect excel presenta lo siguiente:

Que mostrará en pantalla algo parecido a esto:

Es decir, como csv es un formato que deja muchas cosas en el aire y es texto plano podemos definir tipos del mismo usando dialectos. Dependiendo del problema que tengamos que resolver podremos adecuar nuestro dialecto a las necesidades.

Algunas de estas cosas quedarán más claras leyendo la documentación aquí y/o viendo los ejemplos que vamos a ver a continuación.

Vamos a crear un fichero con formato csv con el que trabajar. Yo lo estoy haciendo con IPython o Jupyter Notebook, que tiene un comando mágico llamado writefile, que me permite escribir un fichero de texto a disco. Tú lo puedes hacer igual o puedes usar un editor de texto como Geany, Notepad, Notepad++, vim,… Lo único que tienes que hacer es guardarlo en el mismo sitio desde donde estés ejecutando el código que mostraré a continuación y con el mismo nombre que estoy usando, ‘datos.csv‘:

Para leer el fichero anterior podemos usar lo siguiente, donde definimos que el delimitador de campos es la coma, ‘,’:

Que mostrará en pantalla lo siguiente:

Podéis ver que los valores los ha leído como cadenas de texto, a pesar de que hay números, porque, por defecto, no hace ningún tipo de conversión de datos. Esta función acepta una serie de parámetros que son similares a lo que tenemos disponible en el dialect. En un dialecto, como hemos visto más arriba, podemos definir el delimiter, doublequote,… Y eso mismo lo podemos usar como argumentos para csv.reader. El valor por defecto para quoting es csv.QUOTE_MINIMAL.

Si queremos que los valores que son números se transformen en valores numéricos una vez que los hemos leído podemos usar el el argumento quoting y pasarle el parámetro csv.QUOTE_NONNUMERIC que transformará a float todo lo que no esté entrecomillado:

Que mostrará en pantalla lo siguiente:

Si creo un nuevo fichero csv (fíjate que se llama datos_.csv) con una de las letras sin entrecomillar (fijaos en la primera ‘a’) y uso el código anterior me dirá que no lo puede leer:

Y lo leo con el siguiente código:

Me mostrará un error:

Si ahora uso csv.QUOTE_NONE me entrecomillará todo y mantendrá las comillas originales (aquí vuelvo a usar el fichero datos.csv del principio).

Lo anterior mostrará en pantalla:

En lugar de usar reader podríamos usar DictReader que nos permite leer las filas como un diccionario usando el cabecero como clave:

Lo anterior mostrará esto en pantalla:

Podemos crear nuestro propio dialecto para, por ejemplo, escribir nuestro propio formato a disco:

Vamos a usar el nuevo dialecto creado. Leemos el fichero en formato csv que creamos antes y lo vamos a guardar usando nuestro nuevo dialecto:

Ahora deberíamos tener el nuevo fichero, ‘datos_new.csv‘, separado por barras verticales. Os debería haber quedado algo parecido a lo siguiente:

Dentro del módulo csv hay una utilidad muy interesante que se llama Sniffer. Imaginemos que nos llegan ficheros que pueden tener diferentes separadores (por ejemplo, comas o puntos y comas,…) pero a priori no sabemos de qué tipo será o si tendrá un cabecero,… Sniffer nos puede ayudar con ello. Veamos como.

Leo el fichero que hemos creado.

Y me mostrará en pantalla lo siguiente:

Un segundo ejemplo:

Que mostrará:

De esta forma podríamos ver que lo que nos llega parece que NO tiene un cabecero y parece que el separador es ,. Por supuesto, esto no es infalible pero es mejor que nada.

Para terminar os dejo un EJERCICIO. Tenéis que escribir una función que sea capaz de recibir datos en formato csv que puedan estar separados por ,, ; o (espacio) y puedan tener o no cabecero, lo pueda leer y nos devuelva un diccionario donde la clave sea el campo del cabecero y el valor sea una lista con los valores de la columna. Si no tiene cabecero, que nombre las columnas en orden alfabético comenzando por ‘a’. Por ejemplo, si recibo esto:

que me devuelva esto:

O, si recibo esto:

que me devuelva esto:

Usad los comentarios para mandar el código.

Un saludo.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

six + four =