CSV a Python Dictionary con todos los nombres de columna?

Todavía soy bastante nuevo en usar Python para progtwigr desde cero, así que como ejercicio, tomé un archivo que proceso usando SQL y trato de duplicar la funcionalidad usando Python. Parece que quiero tomar mi archivo csv (comprimido, zip) y crear un Dict de él (¿o tal vez un dict de dicts?). Cuando uso dict dictador, obtengo la primera fila como una clave en lugar de cada columna como su propia clave. P.ej

import csv, sys, zipfile sys.argv[0] = "/home/tom/Documents/REdata/AllListing1RES.zip" zip_file = zipfile.ZipFile(sys.argv[0]) items_file = zip_file.open('AllListing1RES.txt', 'rU') for row in csv.DictReader(items_file,dialect='excel'): pass 

Rendimientos:

 >>> for key in row: print 'key=%s, value=%s' % (key, row[key]) key=MLS_ACCT PARCEL_ID AREA COUNTY STREET_NUM STREET_NAME CITY ZIP STATUS PROP_TYPE LIST_PRICE LIST_DATE DOM DATE_MODIFIED BATHS_HALF BATHS_FULL BEDROOMS ACREAGE YEAR_BUILT YEAR_BUILT_DESC OWNER_NAME SOLD_DATE WITHDRAWN_DATE STATUS_DATE SUBDIVISION PENDING_DATE SOLD_PRICE, value=492859 28-15-3-009-001.0000 200 JEFF 3828 ORLEANS RD MOUNTAIN BROOK 35243 A SFR 324900 3/3/2011 2 3/4/2011 12:04:11 AM 0 2 3 0 1968 EXIST SPARKS 3/3/2011 11:54:56 PM KNOLLWOOD 

Entonces, lo que estoy buscando es una columna para MLS_ACCT y una separada para PARCEL_ID etc., por lo que puedo hacer cosas como precios promedio por todos los artículos que contienen KNOLLWOOD en el campo SUBDIVISION Con una subsección adicional por rango de fechas, fecha de venta, etc. .

Sé bien cómo hacerlo con SQL, pero como dije, estoy tratando de obtener algunas habilidades de Python aquí. He estado leyendo durante los últimos días, pero aún no he encontrado ninguna ilustración muy simple sobre este tipo de caso de uso. Se agradecerán los punteros a dichos documentos. Me doy cuenta de que podría usar la memoria residente de SQL-lite pero, nuevamente, mi deseo es que se aprenda el enfoque de Python. He leído un poco sobre Numpy y Scipy y tengo mucha información pero todavía no puedo encontrar algunas ilustraciones útiles, ya que esas herramientas parecen estar enfocadas en arrays con solo números como elementos y tengo una gran cantidad de concordancia de cadenas que debo hacer, así como cálculos de rango de fechas y comparaciones.

Finalmente, necesitaré sustituir los valores en la tabla (ya que tengo datos sucios), lo hago ahora al tener una “tabla de traducción” que contiene todas las variantes sucias y proporciona una respuesta “limpia” para el uso final.

¿Está seguro de que este es un archivo con valores separados por comas? Parece que las líneas están delimitadas por tabs.

Si esto es correcto, especifique un delimitador de pestaña en el constructor DictReader .

 for row in csv.DictReader(items_file, dialect='excel', delimiter='\t'): for key in row: print 'key=%s, value=%s' % (key, row[key]) 

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

Escribir la operación en Python puro es ciertamente posible, pero tendrás que elegir tus algoritmos. El resultado de la fila que has publicado anteriormente se parece mucho a que el análisis ha salido mal; de hecho, parece no ser un CSV, ¿es un TSV? Intente pasar delimiter='\t' o dialect=csv.excel_tab a DictReader.

Una vez que la lectura se realiza correctamente, DictReader debería funcionar para obtener filas como diccionarios, una estructura típica orientada a filas. Por extraño que parezca, esta no suele ser la forma eficiente de manejar consultas como la suya; Tener solo listas de columnas facilita mucho las búsquedas. La orientación de la fila significa que tiene que rehacer algunos trabajos de búsqueda para cada fila. Cosas como la coincidencia de fechas requieren datos que ciertamente no están presentes en un CSV, como la forma en que se representan las fechas y qué columnas son fechas.

Un ejemplo de cómo obtener una estructura de datos orientada a columnas (sin embargo, implica cargar todo el archivo):

 import csv allrows=list(csv.reader(open('test.csv'))) # Extract the first row as keys for a columns dictionary columns=dict([(x[0],x[1:]) for x in zip(*allrows)]) 

Los pasos intermedios de ir a la lista y almacenar en una variable no son necesarios. La clave es usar zip (o su primo itertools.izip) para transponer la tabla.

Luego, extraiga la columna two de todas las filas con un cierto criterio en la columna one :

 matchingrows=[rownum for (rownum,value) in enumerate(columns['one']) if value>2] print map(columns['two'].__getitem__, matchingrows) 

Cuando conoce el tipo de una columna, puede tener sentido analizarla, usando funciones apropiadas como datetime.datetime.strptime .

A primera vista, parece que su entrada podría no ser realmente CSV, pero tal vez esté delimitada por tabulaciones. Echa un vistazo a los documentos en python.org , puedes crear un dialecto y usarlo para cambiar el delimitador.

 import csv csv.register_dialect('exceltab', delimiter='\t') for row in csv.DictReader(items_file,dialect='exceltab'): pass