Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
ValueError: dictionary update sequence element #0 has length 4; 2 is required
#1
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
Responder
#2
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
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!

También ofrecemos consultoría profesional de desarrollo en Python para personas y empresas.
Responder
#3
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()
Responder
#4
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
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!

También ofrecemos consultoría profesional de desarrollo en Python para personas y empresas.
Responder
#5
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?
Responder
#6
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
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!

También ofrecemos consultoría profesional de desarrollo en Python para personas y empresas.
Responder
#7
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
Responder
#8
Genial Wink
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!

También ofrecemos consultoría profesional de desarrollo en Python para personas y empresas.
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)