Ich lese einen True - False
Wert aus einer Datei und muss ihn in einen Booleschen Wert konvertieren. Derzeit wird es immer in konvertiert, True
auch wenn der Wert auf gesetzt ist False
.
Hier ist ein MWE
von dem, was ich zu tun habe versucht:
with open('file.dat', mode="r") as f:
for line in f:
reader = line.split()
# Convert to boolean <-- Not working?
flag = bool(reader[0])
if flag:
print 'flag == True'
else:
print 'flag == False'
Die file.dat
Datei besteht im Wesentlichen aus einer einzelnen Zeichenfolge mit dem Wert True
oder darin False
geschrieben. Die Anordnung sieht sehr kompliziert aus, da dies ein minimales Beispiel aus einem viel größeren Code ist und ich so Parameter hineinlese.
Warum wird flag
immer konvertiert True
?
Antworten:
bool('True')
undbool('False')
immer zurückkehren,True
da die Zeichenfolgen 'True' und 'False' nicht leer sind.Um einen großartigen Mann (und die Python- Dokumentation ) zu zitieren :
Die eingebaute
bool
Funktion verwendet das Standardverfahren zum Testen der Wahrheit. Deshalb bekommen Sie immerTrue
.Um einen String in einen Booleschen Wert umzuwandeln, müssen Sie Folgendes tun:
def str_to_bool(s): if s == 'True': return True elif s == 'False': return False else: raise ValueError # evil ValueError that doesn't tell you what the wrong value was
quelle
ValueError
indem Sie es tunraise ValueError("Cannot covert {} to a bool".format(s))
.ast
? Es ist Teil der Standardbibliothek, also nicht wirklich extra.bool
konvertiert man die StringsTrue
und nicht einfachFalse
in die booleschen WerteTrue
undFalse
? Scheint inkonsistentes Verhalten von dem zu sein, wasint
tut. Ich bin nur wirklich neugierig, warum meine Argumentation falsch ist und warum die andere Option die Entscheidung war.Sie können verwenden
distutils.util.strtobool
>>> from distutils.util import strtobool >>> strtobool('True') 1 >>> strtobool('False') 0
True
Werte sindy
,yes
,t
,true
,on
und1
;False
Werte sindn
,no
,f
,false
,off
und0
. Erhöht,ValueError
wenn val etwas anderes ist.quelle
bool(strtobool(my_string))
, die Ausgabe als boolesche True / False-Variablestrtobool()
tatsächlich nicht abool
Verwendung
ast.literal_eval
:>>> import ast >>> ast.literal_eval('True') True >>> ast.literal_eval('False') False
Nicht leere Zeichenfolgen sind in Python immer True.
Verwandte: Wahrheitswertprüfung
Wenn NumPy eine Option ist, dann:
>>> import StringIO >>> import numpy as np >>> s = 'True - False - True' >>> c = StringIO.StringIO(s) >>> np.genfromtxt(c, delimiter='-', autostrip=True, dtype=None) #or dtype=bool array([ True, False, True], dtype=bool)
quelle
bool
konvertiert man die StringsTrue
und nicht einfachFalse
in die booleschen WerteTrue
undFalse
? Scheint inkonsistentes Verhalten von dem zu sein, wasint
tut. Ich bin nur wirklich neugierig, warum meine Argumentation falsch ist und warum die andere Option die Entscheidung war.Die sauberste Lösung, die ich gesehen habe, ist:
from distutils.util import strtobool def string_to_bool(string): return bool(strtobool(str(string)))
Sicher, es erfordert einen Import, aber es hat eine ordnungsgemäße Fehlerbehandlung und erfordert sehr wenig Code, der geschrieben (und getestet) werden muss.
quelle
Ich empfehle dies nicht als beste Antwort, sondern nur als Alternative, aber Sie können auch Folgendes tun:
flag = reader[0] == "True"
Das Flag ist
True
ID Reader [0] ist "True", andernfalls ist esFalse
.quelle
Derzeit wird ausgewertet,
True
da die Variable einen Wert hat. Hier finden Sie ein gutes Beispiel dafür, was passiert, wenn Sie beliebige Typen als Booleschen Wert auswerten.Kurz gesagt, Sie möchten die Zeichenfolge
'True'
oder isolieren'False'
und darauf ausführeneval
.>>> eval('True') True >>> eval('False') False
quelle
eval()
. Meiner Meinung nach sollte es aus der Sprache entfernt werden.eval()
Rohdaten aus einer Datei verwenden, bedeutet dies, dass jeder Benutzer mit Schreibzugriff auf diese Datei Code mit denselben Berechtigungsstufen wie Ihr Skript ausführen kann.eval('false')
,eval('FALSE')
wird es Fehler.Sie können dict verwenden, um Zeichenfolgen in Boolesche Werte umzuwandeln. Ändern Sie diese Zeile
flag = bool(reader[0])
in:flag = {'True': True, 'False': False}.get(reader[0], False) # default is False
quelle
Wenn Sie die Groß- und Kleinschreibung nicht berücksichtigen möchten, können Sie einfach Folgendes tun:
b = True if bool_str.lower() == 'true' else False
Anwendungsbeispiel:
>>> bool_str = 'False' >>> b = True if bool_str.lower() == 'true' else False >>> b False >>> bool_str = 'true' >>> b = True if bool_str.lower() == 'true' else False >>> b True
quelle
pip installiere str2bool
>>> from str2bool import str2bool >>> str2bool('Yes') True >>> str2bool('FaLsE') False
quelle
Sie können mit tun
json
.In [124]: import json In [125]: json.loads('false') Out[125]: False In [126]: json.loads('true') Out[126]: True
quelle
Nur um hinzuzufügen, dass, wenn Ihr Wahrheitswert variieren kann, beispielsweise wenn es sich um eine Eingabe aus verschiedenen Programmiersprachen oder aus verschiedenen Typen handelt, eine robustere Methode wäre:
flag = value in ['True','true',1,'T','t','1'] # this can be as long as you want to support
Und eine performantere Variante wäre (Set Lookup ist O (1)):
TRUTHS = set(['True','true',1,'T','t','1']) flag = value in truths
quelle
Wenn Ihre Daten von json stammen, können Sie dies tun
quelle
Wenn Sie eine schnelle Möglichkeit zum Konvertieren von Zeichenfolgen in Bools benötigen (dies funktioniert bei den meisten Zeichenfolgen), versuchen Sie es.
def conv2bool(arg): try: res= (arg[0].upper()) == "T" except Exception,e: res= False return res # or do some more processing with arg if res is false
quelle