Python 2.7 obteniendo la entrada del usuario y manipulando como cadena sin citas


144

Quiero obtener una cadena de un usuario y luego manipularla.

testVar = input("Ask user for something.")

¿Hay alguna manera de que testVar sea una cadena sin que el usuario escriba su respuesta entre comillas? es decir, "Hola" vs. Hola

Si el usuario escribe Hola, me sale el siguiente error:

NameError: el nombre 'Hola' no está definido


Ver documentación . A partir de python 2.7 input, las llamadas se eval()
realizan

Respuestas:


261

Usar en raw_input()lugar de input():

testVar = raw_input("Ask user for something.")

input()en realidad evalúa la entrada como código Python. Sugiero nunca usarlo. raw_input()devuelve la cadena literal ingresada por el usuario.


107
Aunque para cualquiera que lea esto usando Python 3 , inputahora funciona de esta manera, y raw_input se ha ido.
Thomas K

3
¿En qué situación le gustaría que el usuario inserte código de Python en su propio código?
JFA

1
@JFA: No creo que input()sea ​​una función útil, y no recomiendo usarla.
Sven Marnach

11

La función inputtambién evaluará los datos que acaba de leer como código python, que no es realmente lo que desea.

El enfoque genérico sería tratar la entrada del usuario (desde sys.stdin) como cualquier otro archivo. Tratar

import sys
sys.stdin.readline()

Si desea que sea breve, puede usar el raw_inputque es igual inputpero omite la evaluación.


2
Además, si está escribiendo un programa interactivo, considere la importación readline: esto le dará características similares a bash (el historial fuera de la caja, la finalización automática requerirá algo de trabajo preliminar)
Foo Bah

¡Bien hecho! He usado la misma función durante siglos y siempre ha funcionado bien.
CFV

11

Podemos usar la raw_input()función en Python 2 y la input()función en Python 3. Por defecto, la función de entrada toma una entrada en formato de cadena. Para otro tipo de datos, debe emitir la entrada del usuario.

En Python 2 usamos la raw_input()función. Espera a que el usuario escriba algo de entrada y presione returny necesitamos almacenar el valor en una variable al convertirlo como nuestro tipo de datos deseado. Tenga cuidado al usar el tipo de fundición

x = raw_input("Enter a number: ") #String input

x = int(raw_input("Enter a number: ")) #integer input

x = float(raw_input("Enter a float number: ")) #float input

x = eval(raw_input("Enter a float number: ")) #eval input

En Python 3 usamos la función input () que devuelve un valor de entrada de usuario.

x = input("Enter a number: ") #String input

Si ingresa una cadena, int, float, eval tomará como entrada de cadena

x = int(input("Enter a number: ")) #integer input

Si ingresas una cadena para int cast ValueError: invalid literal for int() with base 10:

x = float(input("Enter a float number: ")) #float input

Si ingresa una cadena para el molde flotante ValueError: could not convert string to float

x = eval(input("Enter a float number: ")) #eval input

Si ingresa una cadena para eval cast NameError: name ' ' is not defined Esos errores también se aplican a Python 2.


5

Si desea usar input en lugar de raw_input en python 2.x, entonces este truco será útil

    if hasattr(__builtins__, 'raw_input'):
      input=raw_input

Después de lo cual,

testVar = input("Ask user for something.")

funcionará bien.



0

Mi código de trabajo con correcciones:

import random
import math
print "Welcome to Sam's Math Test"
num1= random.randint(1, 10)
num2= random.randint(1, 10)
num3= random.randint(1, 10)
list=[num1, num2, num3]
maxNum= max(list)
minNum= min(list)
sqrtOne= math.sqrt(num1)

correct= False
while(correct == False):
    guess1= input("Which number is the highest? "+ str(list) + ": ")
    if maxNum == guess1:
        print("Correct!")
        correct = True
    else:
        print("Incorrect, try again")

correct= False
while(correct == False):
guess2= input("Which number is the lowest? " + str(list) +": ")
if minNum == guess2:
     print("Correct!")
     correct = True
else:
    print("Incorrect, try again")

correct= False
while(correct == False):
    guess3= raw_input("Is the square root of " + str(num1) + " greater than or equal to 2? (y/n): ")
    if sqrtOne >= 2.0 and str(guess3) == "y":
        print("Correct!")
        correct = True
    elif sqrtOne < 2.0 and str(guess3) == "n":
        print("Correct!")
        correct = True
    else:
        print("Incorrect, try again")

print("Thanks for playing!")

0

Este es mi trabajo para evitar fallas en caso de que necesite moverme a Python 3 en el futuro.

def _input(msg):
  return raw_input(msg)

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.