2011-01-31 16 views
5

¿Hay una manera de analizar los datos CSV en Python cuando los datos no se encuentra en un archivo? Estoy almacenando datos CSV en mi base de datos y me gustaría analizarlos. Estoy buscando algo similar a Ruby's CSV.parse. Sé que Python tiene una clase CSV, pero todo lo que he visto en los documentos parece tratar con archivos en oposición a los datos CSV en la memoria.de análisis de datos CSV de la memoria en Python

(Y no es una opción para analizar los datos antes de entrar en la base de datos.)

(Y por favor, no me diga que no almacenar los datos CSV en la base de datos. Sé lo que soy haciendo por lo que la base de datos va.)

+0

"Estoy almacenando datos CSV en mi base de datos y me gustaría analizarlos". Esto es ambiguo ¿Está almacenando un archivo CSV completo como un comodín o cadena en la base de datos? ¿Quiere decir que está almacenando todas las piezas de información en una tabla en la base de datos, donde cada columna correspondería a un campo CSV? – gotgenes

+0

Estoy almacenando el archivo completo como un BLOB. –

+1

¿Cuál es la estructura del BLOB? ¿Tienes la opción de guardar los datos en su lugar? – jbcurtin

Respuesta

7

no hay distinción especial para los archivos sobre el módulo Python csv. Puede usar StringIO para envolver sus cadenas como objetos similares a archivos.

+3

[cStringIO] (http://docs.python.org/library/stringio.html#module-cStringIO) es más apropiado en la mayoría de los casos. – gotgenes

1

utilizar el módulo stringio, que le permite vestir cadenas como objetos de tipo fichero. De esta forma, puede pasar un "archivo" stringio al módulo CSV para su análisis (o cualquier otro analizador que pueda estar usando).

1

http://docs.python.org/library/csv.html

csv.reader(csvfile) 

csvfile puede ser cualquier objeto que soporta el protocolo iterador y devuelve una cadena cada vez que sus próximos() método se llama - objetos de archivo y lista de objetos son tanto adecuado .

Si usted tiene, por ejemplo, el contenido de la base de datos en una cadena que se puede analizar como se

import csv 

fromDB = "1,2,3\n4,5,6" 

reader = csv.reader(fromDB.split("\n")) 
for row in reader: 
    print("New row") 
    for col in row: 
    print(" ", col) 
+0

-1 Porque su respuesta es una simple cita RTFM de los documentos sin más explicaciones por qué o cómo esto es útil. Y no responde a la pregunta OP –

+0

@Martin Ejemplo agregado de Thurau (omitiendo la parte de la base de datos, de acuerdo con el último comentario, el contenido del archivo se guarda en la base de datos y no solo filas) – Howard

+0

Esto es mejor. Good Boy;) –

1

Aquí es por qué debería utilizar cStringIO.StringIO (io.StringIO en Python 3.x) en lugar de algún kludge DIY:

>>> import csv 
>>> from cStringIO import StringIO 
>>> fromDB = '"Column\nheading1",hdng2\r\n"data1\rfoo","data2\r\nfoo"\r\n' 
>>> sources = [StringIO(fromDB), fromDB.splitlines(True), 
...  fromDB.splitlines(), fromDB.split("\n")] 
>>> for i, source in enumerate(sources): 
...  print i, list(csv.reader(source)) 
... 
0 [['Column\nheading1', 'hdng2'], ['data1\rfoo', 'data2\r\nfoo']] # OK 
1 [['Column\nheading1', 'hdng2'], ['data1\rfoo', 'data2\r\nfoo']] # OK 
2 [['Columnheading1', 'hdng2'], ['data1foo', 'data2foo']]   # 3 errors 
3 [['Columnheading1', 'hdng2'], ['data1\rfoo', 'data2\rfoo'], []] # 3 errors 
>>> 

usando guff.splitlines(True) es no recomendado, ya que tiene una probabilidad mucho mayor que StringIO(guff) de que quien esté leyendo tu código no tenga idea de qué es lo que hace.