Estoy tratando de escribir un diccionario en un archivo txt. Luego lea los valores de dict escribiendo las teclas con raw_input
. Siento que me falta 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)
name 'p' is not defined
, p debería ser una instancia de la clase PersonRespuestas:
¡Tu código es casi correcto ! Tienes razón, solo te falta un paso. Cuando lee el archivo, lo está 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.Primero escribí que podrías simplemente introducir la cadena, ¡
dict()
pero eso no funciona! Necesitas hacer otra cosa.Ejemplo
Esta es la forma más sencilla: introduzca la cuerda
eval()
. Al igual que:Puedes hacerlo en una línea, pero creo que se ve desordenado de esta manera:
Pero a
eval()
veces no se recomienda. El problema es queeval()
evaluará cualquier cadena, y si alguien lo engaña para que ejecute una cadena realmente complicada, podría suceder algo malo. En este caso, solo está ejecutandoeval()
su propio archivo, por lo que debería estar bien.Pero debido a que
eval()
es útil, alguien creó una alternativa que es más segura. Esto se llamaliteral_eval
y lo obtienes de un módulo de Python llamadoast
.ast.literal_eval()
solo evaluará cadenas que se conviertan en los tipos básicos de Python, por lo que no hay forma de que una cadena complicada pueda hacer algo malo en su computadora.EDITAR
En realidad, la mejor práctica en Python es usar una
with
declaración para asegurarse de que el archivo se cierre correctamente. Reescribiendo lo anterior para usar unawith
declaración:En el Python más popular, conocido como "CPython", por lo general no necesita la
with
declaración ya que las funciones integradas de "recolección de basura" se darán cuenta de que ha terminado con el archivo y lo cerrarán por usted. Pero otras implementaciones de Python, como "Jython" (Python para la máquina virtual de Java) o "PyPy" (un sistema experimental realmente genial con optimización de código justo a tiempo) podrían no cerrar el archivo por usted. Es bueno tener el hábito de usarlowith
, y creo que hace que el código sea bastante fácil de entender.fuente
dict()
espera un diccionario o una lista de tuplas. No evaluará una cadena.¿Has probado el módulo json ? El formato JSON es muy similar al diccionario de Python. Y es legible / escribible por humanos:
Este código se vuelca en un archivo de texto
También puede cargar desde un archivo JSON:
fuente
with
declaración para asegurarse de que se cierre después?d = {"one": {"1" : 1, "a": {"i"}}}
). Por lo tanto, recomiendo el método pickle de @ blender que funciona en mi caso.json.dump({1: 'one'}, file)
se leerá como{'1': 'one'}
cuando se hace json.load. Es mejor usar pickle si no va a leer el archivo guardado en otros lenguajes que no sean Python.Para almacenar objetos de Python en archivos, use el
pickle
módulo:Observe que nunca configuré
b = a
, sinoa
que encurtí en un archivo y luego lo desenvolví enb
.En cuanto a tu error:
self.whip
era un objeto de diccionario.deed.txt
contiene texto, por lo que cuando carga el contenido dedeed.txt
enself.whip
, seself.whip
convierte en la representación de cadena de sí mismo.Probablemente desee evaluar la cadena de nuevo en un objeto Python:
Observe cómo
eval
suenaevil
. Eso es intencional. En su lugar, utilice elpickle
módulo.fuente
Creé mis propias funciones que funcionan muy bien:
Primero almacenará el nombre clave, seguido de todos los valores. Tenga en cuenta que en este caso mi dictado contiene números enteros, por eso se convierte en
int
. Esta es probablemente la parte que necesita cambiar para su situación.fuente
Hola, hay una manera de escribir y leer el diccionario en un archivo, puede convertir su diccionario en formato JSON y leer y escribir rápidamente, solo haga esto:
Para escribir tu fecha:
y leer sus datos:
fuente
Puede iterar a través del par clave-valor y escribirlo en el archivo
fuente