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

Mike Lee
fuente
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.

Sven Marnach
fuente
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.

arrojar
fuente
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.

Projesh Bhoumik
fuente
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.

Prav001
fuente
2
testVar = raw_input("Ask user for something.")
Artur Gaspar
fuente
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!")
st_443
fuente
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)
Mak
fuente
-6

El problema parece resolverse en Python versión 3.4.2.

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

Funcionará bien

Sanjay Ursal
fuente
3
Python 3.x inputes equivalente a Python 2.x raw_input(ver docs.python.org/3.0/whatsnew/3.0.html#builtins ); Este es un problema específico de 2.x.
jonrsharpe