¿Escribir un diccionario en un archivo de texto?

86

Tengo un diccionario y estoy intentando escribirlo en un archivo.

exDict = {1:1, 2:2, 3:3}
with open('file.txt', 'r') as file:
    file.write(exDict)

Entonces tengo el error

file.write(exDict)
TypeError: must be str, not dict

Así que arreglé ese error pero vino otro error

exDict = {111:111, 222:222}
with open('file.txt', 'r') as file:
    file.write(str(exDict))

El error:

file.write(str(exDict))
io.UnsupportedOperation: not writable

No tengo idea de qué hacer ya que todavía soy un principiante en Python. Si alguien sabe cómo resolver el problema, proporcione una respuesta.

NOTA: estoy usando python 3, no python 2

Nic
fuente

Respuestas:

143

En primer lugar, está abriendo el archivo en modo lectura e intentando escribir en él. Consultar - Python de los modos IO

En segundo lugar, solo puede escribir una cadena en un archivo. Si desea escribir un objeto de diccionario, debe convertirlo en una cadena o serializarlo.

import json

# as requested in comment
exDict = {'exDict': exDict}

with open('file.txt', 'w') as file:
     file.write(json.dumps(exDict)) # use `json.loads` to do the reverse

En caso de serialización

import cPickle as pickle

with open('file.txt', 'w') as file:
     file.write(pickle.dumps(exDict)) # use `pickle.loads` to do the reverse

Para python 3.x, la importación del paquete pickle sería diferente

import _pickle as pickle
hspandher
fuente
1
¡Eso funciono! Aunque, solo escribe el contenido del diccionario. ¿Puedes hacer que escriba: exDict = {111: 111, 222: 222}
Nic
Pensé en eso, pero pensé que había una manera mejor. Aunque funciona, ¡gracias!
Nic
Si no está demasiado apegado al =signo, la edición que hice podría hacer el trabajo.
hspandher
La forma en que lo tenía antes: file.write ('exDict =' + json.dumps (exDict)) funcionó bien para mí, ya que lo estoy usando en este momento.
Nic
1
@JanKukacka JSON es un formato de datos estándar. Lo str(exDict)que produciría no siempre será un JSON válido. Una razón desde el fondo de mi cabeza es que las comillas simples no son válidas en un archivo JSON, mientras que pueden estar presentes cuando usamos el strmétodo.
hspandher
49

Lo hago así en Python 3:

with open('myfile.txt', 'w') as f:
    print(mydictionary, file=f)
NKSHELL
fuente
1
Me gusta este porque no es necesario importar. La respuesta más arriba data.write (str (diccionario)) no funcionará con un diccionario correcto, ya que solo escribirá <class 'dict'> en su archivo
Si Lunes
Una cosa que también tengo curiosidad es por qué no imprimir (mydictionary, file = open ('myfile.txt', 'w'))
MadmanLee
@MadmanLee Creo que ambos están bien, y es una cuestión de cómo preferimos que se vea nuestro código.
NKSHELL
1
con open ('myfile.txt', 'r') as f: content = f.read (); dic = eval (contenido);
NKSHELL
La razón por la que json es mejor que simplemente escribir str(mydict)en un archivo es precisamente porque no necesita evalel contenido para recuperar el dictobjeto. evales una lista de seguridad y no debería usarse si hay mejores opciones disponibles.
snakecharmerb
22
fout = "/your/outfile/here.txt"
fo = open(fout, "w")

for k, v in yourDictionary.items():
    fo.write(str(k) + ' >>> '+ str(v) + '\n\n')

fo.close()
Sange Negru
fuente
12
Las respuestas de solo código no se recomiendan porque no explican cómo resuelven el problema. Actualice su respuesta para explicar cómo esto mejora las otras respuestas aceptadas y con voto positivo que esta pregunta ya tiene. Por favor revise ¿Cómo escribo una buena respuesta ?
FluffyKitten
Además, debe usar la withdeclaración al leer y escribir en archivos: stackoverflow.com/questions/3012488/…
Falko
13

El problema con su primer bloque de código era que estaba abriendo el archivo como 'r' a pesar de que quería escribir en él usando 'w'

with open('/Users/your/path/foo','w') as data:
    data.write(str(dictionary))
clyde_the_frog
fuente
esta es la respuesta correcta, ya que el código dentro de la pregunta tiene un error.
Ricardo Rivaldo
Cuando pruebo la ruta json, obtengo un error porque tengo algunos valores "NaN" en flotadores. No hay solución sin dañar los datos en sí si desea escribir JSON. Por lo tanto, esta respuesta es la preferida porque puede guardar un archivo de texto para reflejar con precisión el dictado.
pauljohn32
7

Si desea un diccionario que pueda importar desde un archivo por nombre, y también que agregue entradas que estén bien ordenadas y contenga cadenas que desea conservar, puede probar esto:

data = {'A': 'a', 'B': 'b', }

with open('file.py','w') as file:
    file.write("dictionary_name = { \n")
    for k in sorted (data.keys()):
        file.write("'%s':'%s', \n" % (k, data[k]))
    file.write("}")

Luego para importar:

from file import dictionary_name
MarMat
fuente
Esto solo funciona para cadenas, no para otros tipos en un diccionario.
Paul Kenjora
4

Para los amantes de la comprensión de listas, esto escribirá todos los key : valuepares en nuevas líneas endog.txt

my_dict = {'foo': [1,2], 'bar':[3,4]}

# create list of strings
list_of_strings = [ f'{key} : {my_dict[key]}' for key in my_dict ]

# write string one by one adding newline
with open('dog.txt', 'w') as my_file:
    [ my_file.write(f'{st}\n') for st in list_of_strings ]
DavideL
fuente
1

Sé que esta es una pregunta antigua, pero también pensé en compartir una solución que no involucre a json. Personalmente, no me gusta json porque no permite agregar datos fácilmente. Si su punto de partida es un diccionario, primero puede convertirlo en un marco de datos y luego agregarlo a su archivo txt:

import pandas as pd
one_line_dict = exDict = {1:1, 2:2, 3:3}
df = pd.DataFrame.from_dict([one_line_dict])
df.to_csv('file.txt', header=False, index=True, mode='a')

Espero que esto pueda ayudar.

Angelo
fuente
1
¿Por qué utilizar una biblioteca externa para una tarea sencilla? Python Simple es un principio mejor.
Ricardo Rivaldo
No es muy útil porque la mayoría de los diccionarios que uso no son lo suficientemente simples como para convertirse en objetos útiles de DataFrame.
pauljohn32
1
exDict = {1:1, 2:2, 3:3}
with open('file.txt', 'w+') as file:
    file.write(str(exDict))
ianzo
fuente
-2
import json

with open('tokenler.json', 'w') as file:
     file.write(json.dumps(mydict, ensure_ascii=False))
malibayram91
fuente
Puede mejorar este error agregando una explicación de por qué funciona.
Greg the Incredulous