Libro Python Aplicado de Eugenia Bahit. GNU/Linux, ciencia de datos, y desarrollo web

Banner de Python Aplicado

Manejo de archivos CSV


Cita con formato IEEE:
E. Bahit, "Manejo de archivos CSV", in Python Aplicado, 4th ed., EBRC Publisher, 2022, pp. 91–97.

Cita con formato APA 7:
Bahit, E. (2022). Manejo de archivos CSV. In Python Aplicado (4th ed., pp. 91–97). EBRC Publisher.

Cita en línea:
(Bahit, 2022)

El formato CSV deriva su nombre del inglés «comma separated values» (valores separados por coma), definido en las RFC 4180. Se trata de archivos de texto plano, destinados al almacenamiento masivo de datos. Es uno de los formatos más simples para efectuar análisis de datos.

De hecho, muchos formatos de archivo no libres (o libres pero más complejos), suelen pasarse a formato CSV para aplicar ciencia de datos compleja con diversos lenguajes.

Un archivo CSV se encuentra formado por una cabecera que define nombres de columnas, y las filas siguientes, tienen los datos correspondientes a cada columna, separados por una coma. Sin embargo, muchos otros símbolos pueden utilizarse como separadores de celdas. Entre ellos, el tabulado y el punto y coma son igual de frecuentes que la coma.

Algunos ejemplos de archivos CSV

Datos meteorológicos (separados por ;)

ID;DATA;VV;DV;T;HR;PPT;RS;P
0;2016-03-01 00:00:00;;;9.9;73;;;
1;2016-03-01 00:30:00;;;9.0;67;;;
2;2016-03-01 01:00:00;;;8.3;64;;;
3;2016-03-01 01:30:00;;;8.0;61;;;
4;2016-03-01 02:00:00;;;7.4;62;;;
5;2016-03-01 02:30:00;;;8.3;47;;;
6;2016-03-01 03:00:00;;;7.7;50;;;
7;2016-03-01 03:30:00;;;9.0;39;;;

Puntajes obtenidos por jugadores de un torneo (separados por coma)

nombre,cantidad,anio
Maria,858,1930
Jose,665,1930
Rosa,591,1930
Juan Carlos,522,1930
Antonio,509,1930
Maria Esther,495,1930
Maria Luisa,470,1930
Juana,453,1930
Juan,436,1930

Empresas registradas en la Inspección General de Justicia de Argentina (separados por , y datos entrecomillados)

"numero_correlativo","tipo_societario","descripcion_tipo_societario","razon_social","dada_de_baja","codigo_baja","detalle_baja"
"10","10","SOCIEDAD COLECTIVA","A A VALLE Y COMPA¥IA","S","42014","PERTENECE A REGISTRO ENTIDADES INACTIVAS"
"11","10","SOCIEDAD COLECTIVA","A LUCERO Y H CARATOLI","S","42014","PERTENECE A REGISTRO ENTIDADES INACTIVAS"
"12","10","SOCIEDAD COLECTIVA","A PUIG E HIJOS","S","42014","PERTENECE A REGISTRO ENTIDADES INACTIVAS"
"13","10","SOCIEDAD COLECTIVA","A C I C A","S","42014","PERTENECE A REGISTRO ENTIDADES INACTIVAS"
"14","10","SOCIEDAD COLECTIVA","A¥ON BEATRIZ S Y CIA","S","42014","PERTENECE A REGISTRO ENTIDADES INACTIVAS"
"15","10","SOCIEDAD COLECTIVA","ABA DIESEL","S","42014","PERTENECE A REGISTRO ENTIDADES INACTIVAS"
"16","10","SOCIEDAD COLECTIVA","ABADA L JOSE Y JORGE JOSE ABADAL","S","42014","PERTENECE A REGISTRO ENTIDADES INACTIVAS"
"17","10","SOCIEDAD COLECTIVA","ABADAL JOSE E HIJO","S","42014","PERTENECE A REGISTRO ENTIDADES INACTIVAS"
"18","10","SOCIEDAD COLECTIVA","ABATE Y MACIAS","S","42014","PERTENECE A REGISTRO ENTIDADES INACTIVAS"

Es posible también, encontrar datos almacenados en archivos de texto (TXT) con formatos muy similares al que se espera encontrar en un CSV. A veces es posible desarrollar un script de formato para corregir estos archivos y así poder trabajar con un CSV.

Observaciones meteorológicas en TXT

FECHA    TMAX  TMIN  NOMBRE                                                                         
-------- ----- ----- -------------------------------                                       
07122017  28.0  19.0 AEROPARQUE AERO                                                                
07122017  26.8  12.4 AZUL AERO                                                                      
07122017  29.6   7.8 BAHIA BLANCA AERO                                                              
07122017  22.7   6.7 BARILOCHE AERO                                                                 
07122017   3.0  -8.5 BASE BELGRANO II                                                               
07122017   2.4  -0.2 BASE CARLINI (EX JUBANY)                                                       
07122017   3.9  -0.6 BASE ESPERANZA                                                                 
07122017   0.7  -3.6 BASE MARAMBIO   

Trabajar con archivos CSV desde Python

Python provee de un módulo propio llamado csv, que facilita el parseo de los datos de archivos CSV, tanto para lectura como escritura.

Este módulo, se utiliza en combinación con la estructura with y la función open, para leer o generar el archivo, y el módulo CSV para su análisis (parsing).

Lectura de archivos CSV

Contenido de archivo.csv

0;2016-03-01 00:00:00;;;9.9;73;;;
1;2016-03-01 00:30:00;;;9.0;67;;;
2;2016-03-01 01:00:00;;;8.3;64;;;
3;2016-03-01 01:30:00;;;8.0;61;;;
4;2016-03-01 02:00:00;;;7.4;62;;;
5;2016-03-01 02:30:00;;;8.3;47;;;
6;2016-03-01 03:00:00;;;7.7;50;;;
7;2016-03-01 03:30:00;;;9.0;39;;;
8;2016-03-01 04:00:00;;;8.7;39;;;
from csv import reader


with open("archivo.csv", "r") as archivo: 
    documento = reader(archivo, delimiter=';', quotechar='"')
    for fila in documento:
        ' '.join(fila)

Salida:

'0 2016-03-01 00:00:00 9.9 73 ' '1 2016-03-01 00:30:00 9.0 67 ' '2 2016-03-01 01:00:00 8.3 64 ' '3 2016-03-01 01:30:00 8.0 61 ' '4 2016-03-01 02:00:00 7.4 62 ' '5 2016-03-01 02:30:00 8.3 47 ' '6 2016-03-01 03:00:00 7.7 50 ' '7 2016-03-01 03:30:00 9.0 39 ' '8 2016-03-01 04:00:00 8.7 39 '

Cuando el archivo CSV tiene una cabecera, es necesario saltar dicho encabezado:

Contenido de archivo.csv

ID;DATA;VV;DV;T;HR;PPT;RS;P
0;2016-03-01 00:00:00;;;9.9;73;;;
1;2016-03-01 00:30:00;;;9.0;67;;;
2;2016-03-01 01:00:00;;;8.3;64;;;
3;2016-03-01 01:30:00;;;8.0;61;;;
4;2016-03-01 02:00:00;;;7.4;62;;;
5;2016-03-01 02:30:00;;;8.3;47;;;
6;2016-03-01 03:00:00;;;7.7;50;;;
7;2016-03-01 03:30:00;;;9.0;39;;;
8;2016-03-01 04:00:00;;;8.7;39;;;


from csv import reader
      
      
with open("archivo.csv", "r") as archivo: 
    documento = reader(archivo, delimiter=';', quotechar='"')
    cabeceras = next(documento)
    for fila in documento:
        ' '.join(fila)

Salida:

'0 2016-03-01 00:00:00 9.9 73 ' '1 2016-03-01 00:30:00 9.0 67 ' '2 2016-03-01 01:00:00 8.3 64 ' '3 2016-03-01 01:30:00 8.0 61 ' '4 2016-03-01 02:00:00 7.4 62 ' '5 2016-03-01 02:30:00 8.3 47 ' '6 2016-03-01 03:00:00 7.7 50 ' '7 2016-03-01 03:30:00 9.0 39 ' '8 2016-03-01 04:00:00 8.7 39 '

Otra forma de leer archivos CSV con cabeceras, es utilizar el objeto DictReader en vez de reader, y así acceder solo al valor de las columnas deseadas, por su nombre:

from csv import DictReader
      
with open("archivo.csv", "r") as archivo: 
    documento = DictReader(archivo, delimiter=';', quotechar='"')
    for fila in documento:
        fila['DATA']

Salida:

'2016-03-01 00:00:00' '2016-03-01 00:30:00' '2016-03-01 01:00:00' '2016-03-01 01:30:00' '2016-03-01 02:00:00' '2016-03-01 02:30:00' '2016-03-01 03:00:00' '2016-03-01 03:30:00' '2016-03-01 04:00:00'

Escritura de archivos CSV

Escritura de un CSV sin cabecera:

from csv import writer
      
with open("datos.csv", "w") as archivo: 
    doc = writer(archivo, delimiter=';', quot...