Python 2.7 obtient une entrée utilisateur et manipule sous forme de chaîne sans guillemets

144

Je veux obtenir une chaîne d'un utilisateur, puis la manipuler.

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

Existe-t-il un moyen pour testVar d'être une chaîne sans que l'utilisateur tape sa réponse entre guillemets? c'est-à-dire "Hello" vs. Hello

Si l'utilisateur tape Hello, j'obtiens l'erreur suivante:

NameError: le nom 'Hello' n'est pas défini

Mike Lee
la source
Consultez la documentation . À partir de python 2.7 inputappelle automatiquementeval()
0x45

Réponses:

261

Utilisez à la raw_input()place de input():

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

input()évalue en fait l'entrée en tant que code Python. Je suggère de ne jamais l'utiliser. raw_input()renvoie la chaîne verbatim entrée par l'utilisateur.

Sven Marnach
la source
107
Bien que pour toute personne lisant ceci en utilisant Python 3 , inputfonctionne maintenant de cette façon, et raw_input a disparu.
Thomas K
3
Dans quelle situation voudriez-vous laisser l'utilisateur insérer du code python dans votre propre code?
JFA
1
@JFA: Je ne pense pas que ce input()soit une fonction utile, et je ne recommande pas de l'utiliser.
Sven Marnach le
11

La fonction inputévaluera également les données qu'elle vient de lire en tant que code python, ce qui n'est pas vraiment ce que vous voulez.

L'approche générique consisterait à traiter l'entrée utilisateur (de sys.stdin) comme n'importe quel autre fichier. Essayer

import sys
sys.stdin.readline()

Si vous voulez être bref, vous pouvez utiliser raw_inputce qui est identique à inputmais omet l'évaluation.

mandrin
la source
2
De plus, si vous écrivez un programme interactif, pensez à importer readline- cela donnera des fonctionnalités similaires à bash (l'historique prêt à l'emploi, l'auto-complétion nécessitera un peu de travail)
Foo Bah
Bien joué! J'utilise la même fonction depuis des lustres et cela a toujours bien fonctionné.
CFV
11

Nous pouvons utiliser la raw_input()fonction en Python 2 et la input()fonction en Python 3. Par défaut, la fonction d'entrée prend une entrée au format chaîne. Pour un autre type de données, vous devez convertir l'entrée utilisateur.

En Python 2, nous utilisons la raw_input()fonction. Il attend que l'utilisateur tape une entrée et appuie sur returnet nous devons stocker la valeur dans une variable en convertissant le type de données souhaité. Soyez prudent lors de l'utilisation du type casting

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, nous utilisons la fonction input () qui renvoie une valeur d'entrée utilisateur.

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

Si vous entrez une chaîne, int, float, eval, cela prendra comme entrée de chaîne

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

Si vous entrez une chaîne pour int cast ValueError: invalid literal for int() with base 10:

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

Si vous entrez une chaîne pour la distribution flottante ValueError: could not convert string to float

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

Si vous entrez une chaîne pour eval cast NameError: name ' ' is not defined Ces erreurs s'appliquent également à Python 2.

Projesh Bhoumik
la source
5

Si vous souhaitez utiliser input au lieu de raw_input dans python 2.x, cette astuce vous sera utile

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

Après quoi,

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

fonctionnera très bien.

Prav001
la source
2
testVar = raw_input("Ask user for something.")
Artur Gaspar
la source
0

Mon code de travail avec des correctifs:

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
la source
0

C'est mon travail pour échouer en toute sécurité au cas où je devrais passer à Python 3 à l'avenir.

def _input(msg):
  return raw_input(msg)
Mak
la source
-6

Le problème semble être résolu dans la version 3.4.2 de Python.

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

Fonctionnera très bien.

Sanjay Ursal
la source
3
Python 3.x inputest équivalent à Python 2.x raw_input(voir docs.python.org/3.0/whatsnew/3.0.html#builtins ); il s'agit d'un problème spécifique à 2.x.
jonrsharpe