¿Escribiendo múltiples diccionarios a un archivo csv?

Gracias a este otro hilo, he escrito con éxito mi diccionario en un csv como principiante usando Python: Escribiendo un diccionario en un archivo csv con una línea para cada ‘clave: valor’

dict1 = {0 : 24.7548, 1: 34.2422, 2: 19.3290} 

csv se ve así:

 0 24.7548 1 34.2422 2 19.3290 

Ahora, me pregunto cuál sería el mejor enfoque para organizar varios diccionarios con las mismas claves. Estoy buscando tener las claves como primera columna, luego los valores de dict en columnas después de eso, todos con una primera fila para distinguir las columnas por nombres de diccionarios.

Claro, hay muchos subprocesos que intentan hacer cosas similares, como: Problemas al escribir un diccionario para csv con claves como encabezados y valores como columnas , pero no tengo mis datos estructurados de la misma manera (aún …). Tal vez los diccionarios deben ser fusionados primero.

 dict2 = {0 : 13.422, 1 : 9.2308, 2 : 20.132} dict3 = {0 : 32.2422, 1 : 23.342, 2 : 32.424} 

Mi salida ideal:

 ID dict1 dict2 dict3 0 24.7548 13.422 32.2422 1 34.2422 9.2308 23.342 2 19.3290 20.132 32.424 

No estoy seguro, sin embargo, cómo el ID nombre de columna para los nombres de clave funcionará allí.

Use el módulo csv y comprenda la lista:

 import csv dict1 = {0: 33.422, 1: 39.2308, 2: 30.132} dict2 = {0: 42.2422, 1: 43.342, 2: 42.424} dict3 = {0: 13.422, 1: 9.2308, 2: 20.132} dict4 = {0: 32.2422, 1: 23.342, 2: 32.424} dicts = dict1, dict2, dict3, dict4 with open('my_data.csv', 'wb') as ofile: writer = csv.writer(ofile, delimiter='\t') writer.writerow(['ID', 'dict1', 'dict2', 'dict3', 'dict4']) for key in dict1.iterkeys(): writer.writerow([key] + [d[key] for d in dicts]) 

Tenga en cuenta que los diccionarios están desordenados de forma predeterminada, por lo que si desea que las claves estén en orden ascendente, debe ordenar las claves:

 for key in sorted(dict1.iterkeys(), key=lambda x: int(x)): writer.writerow([key] + [d[key] for d in dicts]) 

Si necesita manejar situaciones en las que no puede estar seguro de que todos los dictados tengan las mismas claves, deberá cambiar algunas cosas pequeñas:

 with open('my_data.csv', 'wb') as ofile: writer = csv.writer(ofile, delimiter='\t') writer.writerow(['ID', 'dict1', 'dict2', 'dict3', 'dict4']) keys = set(d.keys() for d in dicts) for key in keys: writer.writerow([key] + [d.get(key, None) for d in dicts]) 

Use defaultdict(list)

 from collections import defaultdict merged_dict = defaultdict(list) dict_list = [dict1, dict2, dict3] for dict in dict_list: for k, v in dict.items(): merged_dict[k].append(v) 

Esto es lo que obtienes:

 {0: [24.7548, 13.422, 32.2422], 1: [34.2422, 9.2308, 23.342], 2: [19.329, 20.132, 32.424]}) 

Luego escribe el merged_dict en el archivo csv como lo habías hecho anteriormente para un solo dictado. Esta vez el método de writerow del módulo csv será útil.

Aquí hay una forma de hacerlo.

 my_dicts = [dict1, dict2, dict3] dict_names = range(1, len(my_dicts)+1) header = "ID," + ",".join(map(lambda x: "dict"+str(x)), dict_names) + "\n" all_possible_keys = set(reduce(lambda x,y: x + y.keys(), my_dicts, [])) with open("file_to_write.csv", "w") as output_file: output_file.write(header) for k in all_possible_keys: print_str = "{},".format(k) for d in my_dicts: print_str += "{},".format(d.get(k, None)) print_str += "\n" output_file.write(print_str) 

Ha pasado un tiempo desde que usé Python, pero aquí está mi sugerencia. En Python, los valores del diccionario pueden ser de cualquier tipo (por lo que recuerdo, no me llames si me equivoco). Al menos debería ser posible asignar sus claves a las listas.

Así que puede hacer un bucle sobre sus diccionarios y tal vez crear un nuevo diccionario ‘d’, y para cada clave, si el valor ya está en ‘d’, presione el valor al valor de ‘d’ (dado que el valor de la clave asociada es una lista).

Luego puede escribir el nuevo diccionario como: (pseudocódigo) para cada clave, el valor en el diccionario escribe la TAB de escritura para cada v en el valor escribe v + TAB escribe la nueva línea final para

Sin embargo, esto no incluye los ‘nombres de encabezado’, pero estoy seguro de que es bastante fácil de agregar.