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


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.


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.


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.


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.



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!")

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)

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.