Python 2.7 Abrufen von Benutzereingaben und Bearbeiten als Zeichenfolge ohne Anführungszeichen

144

Ich möchte einen String von einem Benutzer erhalten und ihn dann bearbeiten.

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

Gibt es eine Möglichkeit für testVar, eine Zeichenfolge zu sein, ohne dass der Benutzer seine Antwort in Anführungszeichen setzt? dh "Hallo" gegen Hallo

Wenn der Benutzer Hallo eingibt, wird folgende Fehlermeldung angezeigt:

NameError: Name 'Hallo' ist nicht definiert

Mike Lee
quelle
Siehe Dokumentation . Ab Python 2.7 inputruft automatischeval()
0x45

Antworten:

261

Verwenden Sie raw_input()anstelle von input():

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

input()wertet die Eingabe tatsächlich als Python-Code aus. Ich schlage vor, es niemals zu benutzen. raw_input()Gibt die vom Benutzer eingegebene wörtliche Zeichenfolge zurück.

Sven Marnach
quelle
107
Obwohl dies für alle, die dies mit Python 3 lesen , inputjetzt so funktioniert und raw_input weg ist.
Thomas K
3
In welcher Situation möchten Sie den Benutzer Python-Code in Ihren eigenen Code einfügen lassen?
JFA
1
@JFA: Ich denke nicht, dass dies input()eine nützliche Funktion ist, und ich empfehle nicht, sie zu verwenden.
Sven Marnach
11

Die Funktion inputwertet auch die Daten aus, die sie gerade als Python-Code gelesen hat, was nicht wirklich das ist, was Sie wollen.

Der generische Ansatz wäre, die Benutzereingaben (von sys.stdin) wie jede andere Datei zu behandeln. Versuchen

import sys
sys.stdin.readline()

Wenn Sie es kurz halten möchten, können Sie verwenden, raw_inputwas das gleiche ist, inputaber die Auswertung weglässt.

Futter
quelle
2
Wenn Sie ein interaktives Programm schreiben, sollten Sie auch den Import in Betracht ziehen readline- dies bietet ähnliche Funktionen wie Bash (sofort einsatzbereiter Verlauf, automatische Vervollständigung erfordert einige Beinarbeit)
Foo Bah,
Gut gemacht! Ich habe die gleiche Funktion seit Ewigkeiten benutzt und es hat jemals gut funktioniert.
CFV
11

Wir können die raw_input()Funktion in Python 2 und die input()Funktion in Python 3 verwenden. Standardmäßig nimmt die Eingabefunktion eine Eingabe im Zeichenfolgenformat vor. Für andere Datentypen müssen Sie die Benutzereingabe umwandeln.

In Python 2 verwenden wir die raw_input()Funktion. Es wartet darauf, dass der Benutzer eine Eingabe eingibt und drückt, returnund wir müssen den Wert in einer Variablen speichern, indem wir ihn als unseren gewünschten Datentyp umwandeln. Seien Sie vorsichtig, wenn Sie Typguss verwenden

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

In Python 3 verwenden wir die Funktion input (), die einen Benutzereingabewert zurückgibt.

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

Wenn Sie einen String eingeben, int, float, eval, wird dieser als String-Eingabe verwendet

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

Wenn Sie eine Zeichenfolge für int cast eingeben ValueError: invalid literal for int() with base 10:

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

Wenn Sie eine Zeichenfolge für Float Cast eingeben ValueError: could not convert string to float

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

Wenn Sie eine Zeichenfolge für die Bewertung eingeben, gilt NameError: name ' ' is not defined dieser Fehler auch für Python 2.

Projesh Bhoumik
quelle
5

Wenn Sie in Python 2.x Eingabe anstelle von raw_input verwenden möchten, ist dieser Trick hilfreich

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

Nachdem,

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

wird gut funktionieren.

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

Mein Arbeitscode mit Korrekturen:

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
quelle
0

Dies ist meine Arbeit, um sicher zu gehen, falls ich in Zukunft auf Python 3 umsteigen muss.

def _input(msg):
  return raw_input(msg)
Mak
quelle
-6

Das Problem scheint in Python Version 3.4.2 behoben zu sein.

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

Wird gut funktionieren.

Sanjay Ursal
quelle
3
Python 3.x inputentspricht Python 2.x raw_input(siehe docs.python.org/3.0/whatsnew/3.0.html#builtins ); Dies ist ein spezifisches Problem für 2.x.
Jonrsharpe