1
#!/usr/bin/env python
# -*- coding: utf-8 -*-
def Agregar():
    nuevoLibro = input("Introduzca el nombre del libro: \n") #Aquí es donde me lanza el error: NameError: name 'Ejemplo' is not defined
    Escritor = open("Libros.txt", "a")
    Escritor.write(nuevoLibro)
    Escritor.close()
    print("Se ha añadido con éxito")

def Ver():
    Escritor = open("Libros.txt", "r")
    Contenido = Escritor.read()
    print(Contenido)
    Escritor.close()

def Borrar():
    Vacio = ""
    Escritor = open("Libros.txt", "w")
    Escritor.write(Vacio)
    Escritor.close()
    print("Se borró toda la biblioteca")

def Opciones():
    try:
        Opcion = int(input("¿Qué quieres hacer? Seleccione un número \n 1) Agregar | 2) Ver | 3) Borrar | 4) Salir \n"))
    except Exception as e:
        raise e #Aquí estoy tratando de que si el usuario introduce una letra lance un mensaje que le indique que debe escribir un número
    if (Opcion == 1):
        Agregar()
    elif (Opcion == 2):
        Ver()
    elif (Opcion == 3):
        Borrar()
    elif (Opcion == 4):
        print("¡Adios!")
        exit()
    else: 
        print("\n\nDebe seleccionar una opción valida\n\n")
        Opciones()

Opciones()

Estoy tratando de hacer una biblioteca, mi idea es añadir, mostrar, editar,y borrar datos de la misma, pero cuando lo trato de añadir me salta un error en la línea 4 que dice NameError: name 'Ejemplo' is not defined, además no entiendo (o no sé si se podrá) editar una línea específica para así ir actualizando información en vez de borrarlo todo y volverlo a hacer, que es lo que está ocurriendo aquí...

Patricio Moracho
  • 54,367
  • 12
  • 35
  • 68
Daniel Ortin
  • 51
  • 1
  • 7
  • ¿Usas python 2.x por casualidad? – FJSevilla Jul 17 '17 at 16:11
  • Sí, uso Python 2.7 pero también tengo el 3 – Daniel Ortin Jul 17 '17 at 16:12
  • 1
    Mirate https://es.stackoverflow.com/questions/38288/duda-con-raw-input. No uses **nunca** `input` para capturar entradas de usuario Python 2.x sin tener una buena razón, usa `raw_input`. Con `input` intenta interpretar el texto introducido como código Python, como `Ejemplo` no es una variable/clase/función definida en tu espacio de nombres lanza el error. Si tienes Python 3 usa Python 3, ese código es perfectamente válido para Python 3. Saludos. – FJSevilla Jul 17 '17 at 16:15
  • Gracias amigo :) Lo probé con python3 main.py y funcionó. – Daniel Ortin Jul 17 '17 at 16:17
  • 1
    Daniel si puedes usar Python 3 deja Python 2. La rama 2 va a dejar de tener soporte en 2020 y no va a recibir nuevas actualizaciones importantes (Python 2.7 es la última versión). Si estás aprendiendo no tiene sentido usar Python 2, además de complicarte la vida en algunos aspectos, sobretodo con lo referido a la codificación. Saludos – FJSevilla Jul 17 '17 at 16:20
  • Con respecto a lo de editar el archivo, ¿no hay alguna manera de editar el archivo? Para que por ejemplo te salga nano o quizá que introduzcas el número de la línea que quieres editar. – Daniel Ortin Jul 17 '17 at 16:24
  • Puedes usar [`subprocess`](https://docs.python.org/3/library/subprocess.html) para que te abra cualquier editor que tengas en tu sistema si lo deseas, también podrias usar `Tkinter` y abrir un `Text` Widget y editarlo en él. En cuanto a editar una linea usando su número es también posible, lo más simple es cargar todas las líneas en una lista (usa `readlines()`), usas los índices para obtener la línea que quieras, la modificas y sobreescribes el archivo de nuevo usando las líneas de la lista. – FJSevilla Jul 17 '17 at 16:32

1 Answers1

2

Sobre tu problema con la función input, en Python 2 ejecutar esa línea es equivalente a usar una mezcla entre eval() con raw_input():

>>> input("Introduzca el nombre del libro: \n") 
Introduzca el nombre del libro: 
Ejemplo
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1, in <module>
NameError: name 'Ejemplo' is not defined

>>> help(input)
Help on built-in function input in module __builtin__:

input(...)
    input([prompt]) -> value

    Equivalent to eval(raw_input(prompt)).

Por lo tanto, eval() está tratando de encontrar una variable llamada Ejemplo pero esta no ha sido definida. De ahí el error de tipo NameError.

Lo que necesitas es cambiar tu sentencia por raw_input():

>>> nuevoLibro = raw_input("Introduzca el nombre del libro: \n")
Introduzca el nombre del libro: 
Ejemplo
>>> nuevoLibro
'Ejemplo'

Otras recomendaciones:

  • Toma el consejo de @FJSevilla y comienza a migrar hacia Python 3.

  • Para borrar el contenido de un archivo puedes usar truncate():

    def Borrar():
        archivo = open("Libros.txt", "r+")
        archivo.truncate()
        archivo.close()
        print "Se borró toda la biblioteca"
    

    Observa que estoy abriendo el archivo con r+ ya que esto no funciona si abres el archivo en modo de "solo lectura".

César
  • 16,990
  • 6
  • 37
  • 76