Escribir un diccionario en un archivo csv con una línea para cada ‘clave: valor’

Tengo un diccionario:

mydict = {key1: value_a, key2: value_b, key3: value_c}

Quiero escribir los datos en un archivo dict.csv, en este estilo:

 key1: value_a key2: value_b key3: value_c 

Escribí:

 import csv f = open('dict.csv','wb') w = csv.DictWriter(f,mydict.keys()) w.writerow(mydict) f.close() 

Pero ahora tengo todas las claves en una fila y todos los valores en la siguiente fila.

Cuando logro escribir un archivo como este, también quiero volver a leerlo en un nuevo diccionario.

Solo para explicar mi código, el diccionario contiene valores y valores de textctrls y checkboxes (usando wxpython). Quiero agregar los botones “Guardar configuración” y “Cargar configuración”. La configuración de guardar debe escribir el diccionario en el archivo de la manera mencionada (para facilitar al usuario la edición directa del archivo csv), la configuración de carga debe leer el archivo y actualizar los cuadros de texto y las casillas de verificación.

El DictWriter no funciona de la manera que esperas.

 with open('dict.csv', 'w') as csv_file: writer = csv.writer(csv_file) for key, value in mydict.items(): writer.writerow([key, value]) 

Para leerlo de nuevo:

 with open('dict.csv') as csv_file: reader = csv.reader(csv_file) mydict = dict(reader) 

que es bastante compacto, pero asume que no necesita hacer ningún tipo de conversión al leer

La forma más sencilla es ignorar el módulo csv y formatearlo usted mismo.

 with open('my_file.csv', 'w') as f: [f.write('{0},{1}\n'.format(key, value)) for key, value in my_dict.items()] 

Solo para dar una opción, escribir un diccionario en un archivo csv también se puede hacer con el paquete pandas. Con el ejemplo dado podría ser algo como esto:

mydict = {'key1': 'a', 'key2': 'b', 'key3': 'c'}

 import pandas as pd (pd.DataFrame.from_dict(data=mydict, orient='index') .to_csv('dict_file.csv', header=False)) 

Lo principal a tener en cuenta es establecer el parámetro ‘orientar’ para ‘indexar’ dentro del método from_dict . Esto le permite elegir si desea escribir cada clave de diccionario en una nueva fila.

Adicionalmente, dentro del método to_csv , el parámetro del encabezado se establece en Falso solo para tener solo los elementos del diccionario sin filas molestas. Siempre puede establecer nombres de columna e índice dentro del método to_csv.

Tu salida se vería así:

 key1,a key2,b key3,c 

Si, por el contrario, desea que las claves sean los nombres de la columna, simplemente use el parámetro ‘orientar’ predeterminado que es ‘columnas’, como puede verificar en los enlaces de documentación.

 outfile = open( 'dict.txt', 'w' ) for key, value in sorted( mydict.items() ): outfile.write( str(key) + '\t' + str(value) + '\n' ) 

Puedes simplemente hacer

 for key in mydict.keys(): f.write(str(key) + ":" + str(mydict[key]) + ","); 

Para que puedas tener

key_1: value_1, key_2: value_2

Personalmente siempre he encontrado el módulo csv un poco molesto. Espero que alguien más le muestre cómo hacer esto de una manera sencilla, pero mi solución rápida y sucia es:

 with open('dict.csv', 'w') as f: # This creates the file object for the context # below it and closes the file automatically l = [] for k, v in mydict.iteritems(): # Iterate over items returning key, value tuples l.append('%s: %s' % (str(k), str(v))) # Build a nice list of strings f.write(', '.join(l)) # Join that list of strings and write out 

Sin embargo, si desea volver a leerlo, tendrá que hacer un análisis irritante, especialmente si todo está en una línea. Aquí hay un ejemplo usando su formato de archivo propuesto.

 with open('dict.csv', 'r') as f: # Again temporary file for reading d = {} l = f.read().split(',') # Split using commas for i in l: values = i.split(': ') # Split using ': ' d[values[0]] = values[1] # Any type conversion will need to happen here 

Soy un novato, también llego tarde a estos comentarios, jaja, pero, ¿has intentado agregar la “s” en: w.writerow (mydict) de esta manera: w.writerows (mydict), este problema me sucedió pero con Listas, estaba usando singular en lugar de plural. Pops! estaba arreglado