Mensajes: 13
Temas: 3
Registro en: Sep 2022
Reputación:
0
20-10-2022, 11:22 AM
(Última modificación: 20-10-2022, 10:21 PM por Francisco.)
ahora me da este error en el método obtener_telefono:
Código: def obtener_telefono(self,fichero,persona):
try:
f=open(fichero,'r')
except FileNotFoundError :
return('¡El fichero' +fichero + 'no existe!\n')
else:
directorio =f.readlines()
f.close()
directorio=dict([tuple(line.split(','))for line in directorio])
if persona in directorio:
return directorio[persona]
else:
return('¡La persona' +persona+ 'no existe\n')
Error:
Código: Gestion de la agenda telefonica
*********************************
(1)-Obtener un telefono
(2)-Insertar un telefono
(3)-Eliminar un telefono
(4)-Crear la agenda telefonica
(0)-Salir
Seleccione la opcion elegida:1
Introduzca el nombre de la persona:paco
Traceback (most recent call last):
File "d:\seten\PYTHON\Herencia.py", line 96, in <module>
menu.directorio()
File "d:\seten\PYTHON\Herencia.py", line 60, in directorio
print(self.obtener_telefono(fichero,nombre))
File "d:\seten\PYTHON\Herencia.py", line 17, in obtener_telefono
directorio=dict([tuple(line.split(','))for line in directorio])
ValueError: dictionary update sequence element #0 has length 4; 2 is required
Mensajes: 1.300
Temas: 3
Registro en: Feb 2016
Reputación:
71
Hola.
No hay ningún problema de herencia. El tema es que le estás pasando una tupla de 4 elementos a dict() cuando debería ser de 2 (la clave y el valor). Te sugiero que pegues el contenido del fichero que estás leyendo para ver cómo ayudarte.
Saludos
Mensajes: 13
Temas: 3
Registro en: Sep 2022
Reputación:
0
20-10-2022, 03:39 PM
(Última modificación: 20-10-2022, 10:20 PM por Francisco.)
Hola Francisco,te pego el código completo:
Código: import os
class Agenda():
def __init__(self,persona,fichero):
self.persona,self.fichero=persona,fichero
def obtener_telefono(self,fichero,persona):
try:
f=open(fichero,'r')
except FileNotFoundError:
return('¡El fichero' +fichero + 'no existe!\n')
else:
directorio =f.readlines()
f.close()
directorio=dict([tuple(line.split(','))for line in directorio])
if persona in directorio:
return directorio[persona]
else:
return('¡La persona' +persona+ 'no existe\n')
def insertar_telefono(self,fichero,persona,telefono,apellidos,email):
try:
f=open(fichero,'a')
except FileNotFoundError:
return('¡El fichero ' + fichero + 'no existe\n')
else:
f.write(persona+','+str(telefono)+','+ apellidos +',' + email +'\n')
f.close()
return ('El telefono se ha agregado.\n')
def eliminar_telefono(self,fichero,persona):
try:
f=open(fichero,'r')
except FileNotFoundError:
return ('¡El fichero ' + fichero + 'no existe!\n')
else:
directorio =f.readlines()
f.close()
directorio=dict([tuple(line.split(','))for line in directorio])
if persona in directorio:
del directorio[persona]
f=open(fichero,'w')
for nombre,telefono in directorio.items():
f.write(nombre + ',' + telefono)
f.close()
return ('La persona '+ persona + 'no existe\n')
class Menu(Agenda):
def __init__(self,persona,fichero,nombre,telefono,apellidos,email):
super().__init__(persona,fichero)
self.nombre,self.apellidos=nombre,apellidos
self.telefono,self.email=telefono,email
def directorio(self):
fichero=self.fichero
while True:
opcion=self.crear_menu()
if opcion=='1':
nombre=input('Introduzca el nombre de la persona:')
print(self.obtener_telefono(fichero,nombre))
elif opcion == '2':
nombre=input('Introduzca el nombre de la persona:')
apellidos=input('Introduzca los apellidos de la persona:')
telefono=int(input('Introduzca el telefono de la persona:'))
email=input('Introduzca el email de la persona:')
print(self.insertar_telefono(fichero,nombre,telefono,apellidos,email))
elif opcion == '3':
nombre=input('Introduzca el nombre de la persona:')
print(self.eliminar_telefono(fichero,nombre))
elif opcion =='4':
print(self.crear_directorio(fichero))
else:
break
return
def crear_directorio(self,fichero):
if os.path.isfile(self.fichero):
pregunta=input('El fichero '+ fichero + ' ya existe.¿Desea borrarlo? (S/N)?')
if pregunta =='N':
return 'No se ha añadido el fichero porque ya existe.\n'
f=open(self.fichero,'w+')
f.close()
return 'Se ha añadido el fichero.\n'
def crear_menu(self):
print('Gestion de la agenda telefonica')
print('*********************************')
print('(1)-Obtener un telefono')
print('(2)-Insertar un telefono')
print('(3)-Eliminar un telefono')
print('(4)-Crear la agenda telefonica')
print('(0)-Salir')
opcion=input('Seleccione la opcion elegida:')
return opcion
menu = Menu("Paco Ventura","agenda.txt","Paco","670707070","Ventura","miemail@hotmail.com")
menu.directorio()
Mensajes: 1.300
Temas: 3
Registro en: Feb 2016
Reputación:
71
Hola. Me refería al contenido (o aunque sea una parte) de este archivo: agenda.txt. Porque el error ocurre al tratar te transformar eso en un diccionario.
Saludos
Mensajes: 13
Temas: 3
Registro en: Sep 2022
Reputación:
0
hola,
este es el contenido del archivo agenda.txt:
paco,670707070,ventura,mi@hotmail.com
paco,670707070,
paco,670707070
paco,670707070
paco,670707070
Te refieres a esto?
Mensajes: 1.300
Temas: 3
Registro en: Feb 2016
Reputación:
71
22-10-2022, 12:15 AM
(Última modificación: 22-10-2022, 12:16 AM por Francisco.)
Claro, ahí está el problema. Al hacer un split(",") de una línea como esta:
Código: paco,670707070,ventura,mi@hotmail.com
Vas a obtener una lista así:
Código: ['paco', '670707070', 'ventura', 'mi@hotmail.com']
Esa lista tiene más de dos elementos, por lo cual no se puede convertir a un diccionario:
Código: >>> dict(['paco', '670707070', 'ventura', 'mi@hotmail.com'])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: dictionary update sequence element #0 has length 4; 2 is required
Para convertir una lista o tupla a un diccionario, tiene que tener dos elementos: el primero, la clave; y el segundo, el valor. Una solución rápida, para que el primer elemento quede como clave y todo el resto como valor, sería limitar la cantidad de cortes que hace el split():
Código: directorio=dict([tuple(line.split(',', maxsplit=1)) for line in directorio])
Saludos
Mensajes: 13
Temas: 3
Registro en: Sep 2022
Reputación:
0
23-10-2022, 06:32 PM
(Última modificación: 23-10-2022, 06:33 PM por paco7333.)
Hola francisco,
correcto,este error ha quedado solventado,seguire viendo si hay mas fallos,aunque espero que no.
Muchas gracias por tu ayuda
un saludo cordial,
p.d.te mantendré informado con este codigo
además también lo he corregido en el método eliminar_telefono(),porque tenia la misma línea de código errónea y para evitar a repetir el mismo fallo,lo he cambiado por el indicado por ti
Mensajes: 1.300
Temas: 3
Registro en: Feb 2016
Reputación:
71
Genial
|