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 consigo 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 bools de textctrls y casillas de verificación (usando wxpython). Quiero agregar los botones "Guardar configuración" y "Cargar configuración". Guardar configuración debe escribir el diccionario en el archivo de la manera mencionada (para que sea más fácil para el usuario editar el archivo csv directamente), la configuración de carga debe leer desde el archivo y actualizar las textctrls y las casillas de verificación.
fuente
key1, value_a [linebreak] key2, value_b [linebreak] key3, value_c
?repr()
para escribir el dict y luego evaluar la cadena cuando lo lea. Mire esta vieja publicación de SO para una discusión destr()
vs.repr()
, y los documentos también.ConfigParser
móduloRespuestas:
El
DictWriter
no funciona de la forma esperada.with open('dict.csv', 'w') as csv_file: writer = csv.writer(csv_file) for key, value in mydict.items(): writer.writerow([key, value])
Para volver a leerlo:
with open('dict.csv') as csv_file: reader = csv.reader(csv_file) mydict = dict(reader)
que es bastante compacto, pero asume que no necesitas hacer ninguna conversión de tipo al leer
fuente
delimiter=':'
al crear el escritor y el lector :)with
sería mejor. Cambiaré los ejemplos para reflejarlo ...\n
, entrará\n
en el archivo). Si se deja solo, el "modo universal" se activa y las nuevas líneas se traducen al valor predeterminado para el sistema operativo actual. Dado que no es realmente útil aquí (excepto si desea tener nuevas líneas predecibles), lo eliminaré.Solo para dar una opción, también se puede escribir un diccionario en un archivo csv 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 'orient' en 'index' dentro del método from_dict . Esto le permite elegir si desea escribir cada clave del diccionario en una nueva fila.
Además, dentro del método to_csv , el parámetro de encabezado se establece en False solo para tener solo los elementos del diccionario sin filas molestas. Siempre puede establecer nombres de columnas e índices dentro del método to_csv.
Su salida se vería así:
Si, en cambio, desea que las claves sean los nombres de las columnas, simplemente use el parámetro predeterminado 'orientar' que es 'columnas', como puede verificar en los enlaces de la documentación.
fuente
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()]
fuente
key
obtiene una coma, lo pasará mal.csv.writer(...).writerows(my_dict.items())
. Elcsv
módulo hace mucho más que simplemente agregar comas y nuevas líneas.outfile = open( 'dict.txt', 'w' ) for key, value in sorted( mydict.items() ): outfile.write( str(key) + '\t' + str(value) + '\n' )
fuente
Puedes simplemente hacer:
for key in mydict.keys(): f.write(str(key) + ":" + str(mydict[key]) + ",");
Para que puedas tener
clave_1: valor_1, clave_2: valor_2
fuente
','.join("%s:%s" % (k,v) for k,v in mydict.items())
: por lo general, es mejor iterar sobre los elementos de un dictado, que le brinda claves y valores juntos, que sobre las claves de un dictado y haciendo búsquedas de 'n' valores.','.join(...)
se encarga de poner solo comas entre los valores, sin agregar la coma final adicional.Personalmente, siempre he encontrado el módulo csv un poco molesto. Espero que alguien más le muestre cómo hacer esto hábilmente con él, 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, deberá realizar un análisis irritante, especialmente si está todo en una sola línea. Aquí tienes un ejemplo con el 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
fuente
import csv dict = {"Key Header":"Value Header", "key1":"value1", "key2":"value2"} with open("test.csv", "w") as f: writer = csv.writer(f) for i in dict: writer.writerow([i, dict[i]]) f.close()
fuente
#code to insert and read dictionary element from csv file import csv n=input("Enter I to insert or S to read : ") if n=="I": m=int(input("Enter the number of data you want to insert: ")) mydict={} list=[] for i in range(m): keys=int(input("Enter id :")) list.append(keys) values=input("Enter Name :") mydict[keys]=values with open('File1.csv',"w") as csvfile: writer = csv.DictWriter(csvfile, fieldnames=list) writer.writeheader() writer.writerow(mydict) print("Data Inserted") else: keys=input("Enter Id to Search :") Id=str(keys) with open('File1.csv',"r") as csvfile: reader = csv.DictReader(csvfile) for row in reader: print(row[Id]) #print(row) to display all data
fuente
¿Ha intentado agregar la "s" en:
w.writerow(mydict)
asíw.writerows(mydict)
:? Este problema me sucedió, pero con las listas, estaba usando singular en lugar de plural.fuente