¿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

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

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)

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()

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))

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

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 ]

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.


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))


-2
import json

with open('tokenler.json', 'w') as file:
     file.write(json.dumps(mydict, ensure_ascii=False))

Puede mejorar este error agregando una explicación de por qué funciona.
Greg the Incredulous
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.