Creando un diccionario desde un archivo CSV

Estoy en el proceso de intentar escribir un script de Python que tomará información de un archivo CSV y luego lo insertará en un formato de diccionario (estoy usando Python 3.x).

Uso el siguiente código para leer el archivo CSV y funciona:

import csv reader = csv.reader(open('C:\\Users\\Chris\\Desktop\\test.csv'), delimiter=',', quotechar='|') for row in reader: print(', '.join(row)) 

Pero ahora quiero colocar los resultados en un diccionario. Me gustaría que la primera fila del archivo CSV se use como el campo “clave” para el diccionario con las filas subsiguientes en el archivo CSV que completan la parte de datos.

Data de muestra:

  Date First Name Last Name Score 12/28/2012 15:15 John Smith 20 12/29/2012 15:15 Alex Jones 38 12/30/2012 15:15 Michael Carpenter 25 

Hay cosas adicionales que me gustaría hacer con este código, pero por el momento solo busco que funcione el diccionario es lo que estoy buscando.

Puede alguien ayudarme con esto?

Versión editada 2:

 import csv reader = csv.DictReader(open('C:\\Users\\Chris\\Desktop\\test.csv')) result = {} for row in reader: for column, value in row.items(): result.setdefault(column, []).append(value) print('Column -> ', column, '\nValue -> ', value) print(result) fieldnames = result.keys() csvwriter = csv.DictWriter(open('C:\\Users\\Chris\\Desktop\\test_out.csv', 'w'), delimiter=',', fieldnames=result.keys()) csvwriter.writerow(dict((fn,fn) for fn in fieldnames)) for row in result.items(): print('Values -> ', row) #csvwriter.writerow(row) ''' Test output ''' test_array = [] test_array.append({'fruit': 'apple', 'quantity': 5, 'color': 'red'}); test_array.append({'fruit': 'pear', 'quantity': 8, 'color': 'green'}); test_array.append({'fruit': 'banana', 'quantity': 3, 'color': 'yellow'}); test_array.append({'fruit': 'orange', 'quantity': 11, 'color': 'orange'}); fieldnames = ['fruit', 'quantity', 'color'] test_file = open('C:\\Users\\Chris\\Desktop\\test_out.csv','w') csvwriter = csv.DictWriter(test_file, delimiter=',', fieldnames=fieldnames) csvwriter.writerow(dict((fn,fn) for fn in fieldnames)) for row in test_array: print(row) csvwriter.writerow(row) test_file.close() 

Related of "Creando un diccionario desde un archivo CSV"

Crea un diccionario, luego itera sobre el resultado y rellena las filas en el diccionario. Tenga en cuenta que si encuentra una fila con una fecha duplicada, tendrá que decidir qué hacer (generar una excepción, reemplazar la fila anterior, descartar la fila posterior, etc.)

Aquí está test.csv:

 Date,Foo,Bar 123,456,789 abc,def,ghi 

y el progtwig correspondiente:

 import csv reader = csv.reader(open('test.csv')) result = {} for row in reader: key = row[0] if key in result: # implement your duplicate row handling here pass result[key] = row[1:] print result 

rendimientos

 {'Date': ['Foo', 'Bar'], '123': ['456', '789'], 'abc': ['def', 'ghi']} 

o, con DictReader:

 import csv reader = csv.DictReader(open('test.csv')) result = {} for row in reader: key = row.pop('Date') if key in result: # implement your duplicate row handling here pass result[key] = row print result 

resultados en:

 {'123': {'Foo': '456', 'Bar': '789'}, 'abc': {'Foo': 'def', 'Bar': 'ghi'}} 

O quizás desee asignar los encabezados de columna a una lista de valores para esa columna:

 import csv reader = csv.DictReader(open('test.csv')) result = {} for row in reader: for column, value in row.iteritems(): result.setdefault(column, []).append(value) print result 

Eso rinde:

 {'Date': ['123', 'abc'], 'Foo': ['456', 'def'], 'Bar': ['789', 'ghi']} 

Necesitas una clase de Python DictReader . Más ayuda se puede encontrar desde aquí

 import csv with open('file_name.csv', 'rt') as f: reader = csv.DictReader(f) for row in reader: print row 

La ayuda de @phil-frost fue muy útil, era exactamente lo que estaba buscando.

He hecho algunos ajustes después de eso, así que me gustaría compartirlo aquí:

 def csv_as_dict(file, ref_header, delimiter=None): import csv if not delimiter: delimiter = ';' reader = csv.DictReader(open(file), delimiter=delimiter) result = {} for row in reader: print(row) key = row.pop(ref_header) if key in result: # implement your duplicate row handling here pass result[key] = row return result 

Puedes llamarlo:

 myvar = csv_as_dict(csv_file, 'ref_column') 

Donde ref_colum será su clave principal para cada fila.

¿Has considerado usar Apache Solr ? Es compatible con la puntuación de búsqueda y consume fácilmente datos de archivos CSV. Descubrirá que se amplía de forma impresionante y tiene muchas otras opciones para analizar sus datos, por ejemplo, soporte para múltiples idiomas o consultas mal escritas.

Ejemplos

  • Crear informe y subirlo al servidor para descargarlo.
  • SOLR – El mejor enfoque para importar 20 millones de documentos desde un archivo CSV