martes, 16 de diciembre de 2008

Manejando Archivos CSV con Python

No siempre los archivos CSV "Comma Separated Values" (Valores Separados por Coma) usan la coma para separar los datos, algunas veces usan TAB o espacios
Si trabajas con archivos CSV y usas el módulos csv de Python podrías hacer tu trabajo un poco mas facil.

Trabajar con archivos CSV en Python probablemente no seria tan fácil. Por ejemplo, si tienes un archivo CSV que contiene 3 columnas "A", "B" y "C D".

$ cat prueba.csv
A,B,"C D"
1,2,"3 4"
5,6,7


El siguiente programa en Python lee y muestra su contenido:

import csv

ifile = open('prueba.csv', "rb")
reader = csv.reader(ifile)

rownum = 0
for row in reader:
# Save header row.
if rownum == 0:
header = row
else:
colnum = 0
for col in row:
print '%-8s: %s' % (header[colnum], col)
colnum += 1

rownum += 1

ifile.close()

El cual muestra lo siguiente:

$ python csv1.py
A : 1
B : 2
C D : 3 4
A : 5
B : 6
C D : 7


Ademas, el modulo csv provee un objecto para escribir archivos CSV. El siguiente programa Python convierte el archivo prueba CSV en un archivo CSV que usa tabs como separador de valores y tiene todo los valores entre comillas. El carácter delimitador y la comillas, están especificados cuando el escritor es creado. La misma opcion esta disponible cuando se crea el objecto lector.

import csv

ifile = open('prueba.csv', "rb")
reader = csv.reader(ifile)
ofile = open('ttest.csv', "wb")
writer = csv.writer(ofile, delimiter='\t', quotechar='"', quoting=csv.QUOTE_ALL)

for row in reader:
writer.writerow(row)

ifile.close()
ofile.close()

Al ejecutarlo muestra lo siguiente:

$ python csv2.py
$ cat ttest.csv
"A" "B" "C D"
"1" "2" "3 4"
"5" "6" "7"


El siguiente ejemplo muestra como escribir una función para tratar de determinar que formato de archivo CSV es antes de abrirlo, así se puede lidiar con comas y tabs y diferentes tipos de comillas.

import os
import sys
import csv

def opencsv(filename):
tfile = open(filename, "r")
line = tfile.readline()
tfile.close()
if line[0] == '"':
quote_char = '"'
quote_opt = csv.QUOTE_ALL
elif line[0] == "'":
quote_char = "'"
quote_opt = csv.QUOTE_ALL
else:
quote_char = '"'
quote_opt = csv.QUOTE_MINIMAL

if line.find('\t') != -1:
delim_char = '\t'
else:
delim_char = ','

tfile = open(filename, "rb")
reader = csv.reader(tfile, delimiter=delim_char, quotechar=quote_char, quoting=quote_opt)
return (tfile, reader)
Fuente.

1 comentario:

Anónimo dijo...

Lo de poner el fondo de tu blog en negro, se carga el contenido. No se ve el script