Ficheros csv (lectura)

Los archivos csv (comma separatted values) están compuestos de datos en texto plano al estilo de una tabla. Estos datos están separados por campos y por líneas. La primera línea puede contener los títulos de los campos, aunque esto es opcional ya que no existe un estándar. El resto de líneas contiene los datos que corresponden a estos campos. Estos campos están separados por comas, aunque también es posible usar otro carácter separador siempre que se mantenga el mismo en todo el fichero.

Por ejemplo, un archivo llamado perros.csv puede contener algo así:

Raza,Tamaño
Dalmata,Grande
Basset Hound,Mediano
Border Collie,Mediano
Galgo Saluki,Grande
Husky Siberiano,Grande
Caniche,Pequeño

Es algo parecido a una hoja de cálculo en la que cada línea representa las filas de la tabla y cada campo las columnas de la misma.

Python puede tratar los archivos csv gracias al módulo csv. Para hacer uso de este módulo es necesario que lo importemos desde nuestro código.

import csv

reader

Para leer estos ficheros se debe crear primero un objeto reader que permita recorrer las líneas de los datos del fichero csv.

El siguiente ejemplo importa el módulo csv, abre el archivo perros.csv y asigna a la variable fichero el manejador correspondiente. Luego utiliza el método reader del módulo csv para convertir datos en un objeto lector con todos los datos del fichero. Finalmente convierte ese objeto en una lista y la muestra en pantalla.

import csv
fichero = open('perros.csv')
datos = csv.reader(fichero)
lista = list(datos)
print(lista)

El resultado de ejecutar el script es el siguiente:

python lectorcsv.py
[['Raza', 'Tamaño'], ['Dalmata', 'Grande'], ['Basset Hound', 'Mediano'], ['Border Collie', 'Mediano'], ['Galgo Saluki', 'Grande'], ['Husky Siberiano', 'Grande'], ['Caniche', 'Pequeño']]

Se ha convertido en una lista multidimensional que contiene los títulos de los campos en el primer elemento y el resto de datos en los siguientes elementos. Se puede recorrer la lista usando su índice. Por ejemplo el elemento que contiene los títulos está en el índice 0.

print(lista[0])

El título del primer campo se muestra accediendo a la primera posición del primer elemento de la lista:

print(lista[0][0])

Y el segundo título se muestra accediendo a la segunda posición del primer elemento de la lista.

print(lista[0][1])

Otra forma de conseguir esto sin convertir el reader en una lista es recorrerlo con un bucle for in. Por ejemplo, el siguiente código, lee el fichero, línea por línea y muestra el número de línea y su contenido.

import csv
fichero = open('perros.csv')
datos = csv.reader(fichero)
for registro in datos:
    print('Línea: %s -> %s' %(str(datos.line_num),str(registro)))

Un elemento a tener en cuenta es la diferencia de acceso entre el objeto reader actual y el acceso a los elementos de la lista del ejemplo anterior. El objeto reader numera los elementos comenzando con el número 1, mientras que el primer elemento de una lista es el elemento 0. El resultado de ejecutar este código es este:

Línea: 1 -> ['Raza', 'Tamaño']
Línea: 2 -> ['Dalmata', 'Grande']
Línea: 3 -> ['Basset Hound', 'Mediano']
Línea: 4 -> ['Border Collie', 'Mediano']
Línea: 5 -> ['Galgo Saluki', 'Grande']
Línea: 6 -> ['Husky Siberiano', 'Grande']
Línea: 7 -> ['Caniche', 'Pequeño']

Pero que ocurre si el fichero csv estuviera delimitado con un carácter diferente a la coma. En ese caso solo hay que indicar al reader que el delimitador es diferente y el resto de código sigue igual. Para eso se usa el argumento delimiter = ‘caracter_delimitador’

En el siguiente ejemplo el archivo perros2.csv contiene los siguientes datos:

Raza;Tamaño
Dalmata;Grande
Basset Hound;Mediano
Border Collie;Mediano
Galgo Saluki;Grande
Husky Siberiano;Grande
Caniche;Pequeño

Y la lectura y muestra de su contenido se realiza con el siguiente código, en el que se ha incluido delimiter=’;’.

import csv
fichero = open('perros2.csv')
datos = csv.reader(fichero, delimiter=';')
for registro in datos:
    print('Línea: %s -> %s' %(str(datos.line_num),str(registro)))

Otro argumento interesante puede ser dialect, el cual intenta estandarizar el objeto csv, puede usarse con los valores: excel, excel-tab y unix. Este argumento le índica al lector csv que delimitador, carácter de escape, terminador de línea, etc, usará.

El siguiente ejemplo usa los dialectos de csv y muestra su parametrización:

import csv
fichero = open('perros2.csv')
print(csv.list_dialects())
for dialecto in csv.list_dialects():
    print('Configuración para el dialecto: %s' % dialecto)
    pd = csv.get_dialect(dialecto)
    print('Delimitador %s' % pd.delimiter)
    print('Doble comilla %s' % pd.doublequote)
    print('Carácter de escape %s' % pd.escapechar)
    print('Fin de línea %s' % pd.lineterminator)
    print('Carácter de cita %s' % pd.quotechar)
    print('Citar %s' % pd.quoting)
    print('Saltar espacio inicial %s' % pd.skipinitialspace)
    print('Estricto %s' % pd.strict)

El resultado debe de ser algo parecido a esto:

['excel', 'excel-tab', 'unix']
Configuración para el dialecto: excel
Delimitador ,
Doble comilla True
Carácter de escape None
Fin de línea 

Carácter de cita "
Citar 0
Saltar espacio inicial False
Estricto False
Configuración para el dialecto: excel-tab
Delimitador 	
Doble comilla True
Carácter de escape None
Fin de línea 

Carácter de cita "
Citar 0
Saltar espacio inicial False
Estricto False
Configuración para el dialecto: unix
Delimitador ,
Doble comilla True
Carácter de escape None
Fin de línea 

Carácter de cita "
Citar 1
Saltar espacio inicial False
Estricto False

DictReader

El objeto DictReader ofrece una forma mas interesante de trabajar con los ficheros csv ya que mapea el contenido del archivo csv a un diccionario Python usando la primera línea para obtener los títulos.

El diccionario se puede recorrer usando el título como índice, tal como se muestra en el siguiente ejemplo:

import csv
fichero = open('perros.csv')
lector = csv.DictReader(fichero)
for fila in lector:
    print('%s %s' %(fila['Raza'],fila['Tamaño']))

Que mostraría los siguientes datos.

Dalmata Grande
Basset Hound Mediano
Border Collie Mediano
Galgo Saluki Grande
Husky Siberiano Grande
Caniche Pequeño

Deja una respuesta

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