¿Escribir un dictado en un archivo txt y leerlo de nuevo?

Estoy tratando de escribir un diccionario en un archivo de texto. Luego lea los valores de dict escribiendo las claves con raw_input . Siento que solo estoy faltando un paso pero he estado buscando por un tiempo.

Me sale este error

 File "name.py", line 24, in reading print whip[name] TypeError: string indices must be integers, not str 

Mi código:

 #!/usr/bin/env python from sys import exit class Person(object): def __init__(self): self.name = "" self.address = "" self.phone = "" self.age = "" self.whip = {} def writing(self): self.whip[p.name] = p.age, p.address, p.phone target = open('deed.txt', 'a') target.write(str(self.whip)) print self.whip def reading(self): self.whip = open('deed.txt', 'r').read() name = raw_input("> ") if name in self.whip: print self.whip[name] p = Person() while True: print "Type:\n\t*read to read data base\n\t*write to write to data base\n\t*exit to exit" action = raw_input("\n> ") if "write" in action: p.name = raw_input("Name?\n> ") p.phone = raw_input("Phone Number?\n> ") p.age = raw_input("Age?\n> ") p.address = raw_input("Address?\n>") p.writing() elif "read" in action: p.reading() elif "exit" in action: exit(0) 

Tu código es casi correcto ! Tienes razón, solo te estás perdiendo un paso. Cuando lees el archivo, lo estás leyendo como una cadena; pero desea convertir la cadena de nuevo en un diccionario.

El mensaje de error que vio fue porque self.whip era una cadena, no un diccionario.

La primera vez que escribí fue que simplemente podría introducir la cadena en dict() pero eso no funciona! Necesitas hacer otra cosa.

Ejemplo

Esta es la forma más sencilla: introduzca la cadena en eval() . Al igual que:

 def reading(self): s = open('deed.txt', 'r').read() self.whip = eval(s) 

Puedes hacerlo en una línea, pero creo que se ve desordenado de esta manera:

 def reading(self): self.whip = eval(open('deed.txt', 'r').read()) 

Pero a veces no se recomienda eval() . El problema es que eval() evaluará cualquier cadena, y si alguien te engaña para que ejecutes una cadena realmente difícil, algo malo podría pasar. En este caso, solo está ejecutando eval() en su propio archivo, por lo que debería estar bien.

Pero debido a que eval() es útil, alguien le hizo una alternativa más segura. Esto se llama literal_eval y lo obtiene de un módulo de Python llamado ast .

 import ast def reading(self): s = open('deed.txt', 'r').read() self.whip = ast.literal_eval(s) 

ast.literal_eval() solo evaluará cadenas que se convierten en los tipos básicos de Python, por lo que no hay forma de que una cadena delicada pueda hacer algo malo en tu computadora.

EDITAR

En realidad, la mejor práctica en Python es usar una statement with para asegurarse de que el archivo se cierre correctamente. Reescribiendo lo anterior para usar una statement with :

 import ast def reading(self): with open('deed.txt', 'r') as f: s = f.read() self.whip = ast.literal_eval(s) 

En el Python más popular, conocido como “CPython”, por lo general no necesita la statement with , ya que las funciones integradas de “recolección de basura” descubrirán que ha terminado con el archivo y lo cerrará por usted. Pero otras implementaciones de Python, como “Jython” (Python para Java VM) o “PyPy” (un sistema experimental realmente genial con optimización de código justo a tiempo) pueden no resolver el archivo por usted. Es bueno tener el hábito de usar with , y creo que hace que el código sea bastante fácil de entender.

¿Has probado el módulo json ? El formato JSON es muy similar al diccionario de Python. Y es legible / escribible por humanos:

 >>> import json >>> d = {"one":1, "two":2} >>> json.dump(d, open("text.txt",'w')) 

Este código se vuelca en un archivo de texto.

 $ cat text.txt {"two": 2, "one": 1} 

También puedes cargar desde un archivo JSON:

 >>> d2 = json.load(open("text.txt")) >>> print d2 {u'two': 2, u'one': 1} 

Para almacenar objetos de Python en archivos, use el módulo pickle :

 import pickle a = { 'a': 1, 'b': 2 } with open('file.txt', 'wb') as handle: pickle.dump(a, handle) with open('file.txt', 'rb') as handle: b = pickle.loads(handle.read()) print a == b # True 

Tenga en cuenta que nunca puse b = a , sino que en lugar de decapé a un archivo y luego lo deseché en b .

En cuanto a tu error:

 self.whip = open('deed.txt', 'r').read() 

self.whip era un objeto de diccionario. deed.txt contiene texto, por lo que cuando carga el contenido de deed.txt en self.whip , self.whip convierte en la representación de cadena de sí mismo.

Probablemente querrás evaluar la cadena nuevamente en un objeto Python:

 self.whip = eval(open('deed.txt', 'r').read()) 

Fíjate cómo eval suena como el evil . Eso es intencional. Utilice el módulo pickle lugar.

Creé mis propias funciones que funcionan muy bien:

 def writeDict(dict, filename, sep): with open(filename, "a") as f: for i in dict.keys(): f.write(i + " " + sep.join([str(x) for x in dict[i]]) + "\n") 

Primero almacenará el nombre de clave, seguido de todos los valores. Tenga en cuenta que en este caso mi dict contiene enteros, por eso se convierte en int . Esta es probablemente la parte que necesita cambiar para su situación.

 def readDict(filename, sep): with open(filename, "r") as f: dict = {} for line in f: values = line.split(sep) dict[values[0]] = {int(x) for x in values[1:len(values)]} return(dict) 

Puede iterar a través del par clave-valor y escribirlo en el archivo

 pair = {'name': name,'location': location} with open('F:\\twitter.json', 'a') as f: f.writelines('{}:{}'.format(k,v) for k, v in pair.items()) f.write('\n') 

Hola, hay una forma de escribir y leer el diccionario en un archivo. Puede convertir su diccionario al formato JSON y leer y escribir rápidamente. Haga esto:

Para escribir tu fecha:

  import json your_dictionary = {"some_date" : "date"} f = open('destFile.txt', 'w+') f.write(json.dumps(your_dictionary)) 

y para leer tus datos:

  import json f = open('destFile.txt', 'r') your_dictionary = json.loads(f.read())