Я читаю True - False
значение из файла, и мне нужно преобразовать его в логическое значение. В настоящее время он всегда преобразует его в, True
даже если установлено значение False
.
Вот MWE
что я пытаюсь сделать:
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'
file.dat
Файл в основном состоит из одной строки со значением True
или False
письменной внутри. Расположение выглядит очень запутанным, потому что это минимальный пример из гораздо большего кода, и именно так я считываю в него параметры.
Почему flag
всегда конвертируется в True
?
Ответы:
bool('True')
иbool('False')
всегда возвращать,True
потому что строки «Истина» и «Ложь» не пусты.Процитирую великого человека (и документацию Python ):
Встроенная
bool
функция использует стандартную процедуру проверки истинности. Вот почему ты всегда получаешьTrue
.Чтобы преобразовать строку в логическое значение, вам нужно сделать что-то вроде этого:
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
источник
ValueError
, сделав этоraise ValueError("Cannot covert {} to a bool".format(s))
.ast
? Это часть стандартной библиотеки, поэтому на самом деле не лишняя.bool
просто не преобразовать строкиTrue
иFalse
в логические значенияTrue
иFalse
? Кажется, непоследовательное поведение от того, чтоint
делает. Мне просто искренне любопытно, почему мои рассуждения неверны и почему был выбран другой вариант.ты можешь использовать
distutils.util.strtobool
>>> from distutils.util import strtobool >>> strtobool('True') 1 >>> strtobool('False') 0
True
значенияy
,yes
,t
,true
,on
и1
;False
значенияn
,no
,f
,false
,off
и0
. Повышает,ValueError
если val - это что-то еще.источник
bool(strtobool(my_string))
вывод как логическую переменную True / Falsestrtobool()
на самом деле не возвращаетbool
Использование
ast.literal_eval
:>>> import ast >>> ast.literal_eval('True') True >>> ast.literal_eval('False') False
Непустые строки всегда имеют значение True в Python.
Связанный: Проверка истинности
Если NumPy - вариант, то:
>>> 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)
источник
bool
просто не преобразовать строкиTrue
иFalse
в логические значенияTrue
иFalse
? Кажется, непоследовательное поведение от того, чтоint
делает. Мне просто искренне любопытно, почему мои рассуждения неверны и почему был выбран другой вариант.Самое чистое решение, которое я видел:
from distutils.util import strtobool def string_to_bool(string): return bool(strtobool(str(string)))
Конечно, для этого требуется импорт, но он имеет правильную обработку ошибок и требует написания (и тестирования) очень небольшого количества кода.
источник
Я не предлагаю это как лучший ответ, это просто альтернатива, но вы также можете сделать что-то вроде:
flag = reader[0] == "True"
flag будет
True
id reader [0] - True, в противном случае будетFalse
.источник
В настоящее время выполняется оценка,
True
поскольку переменная имеет значение. Здесь есть хороший пример того, что происходит, когда вы оцениваете произвольные типы как логические.Короче говоря, вы хотите изолировать строку
'True'
or'False'
и запуститьeval
ее.>>> eval('True') True >>> eval('False') False
источник
eval()
. На мой взгляд, его следует удалить с языка.eval()
необработанные данные из файла, это означает, что любой, у кого есть доступ на запись к этому файлу, может выполнять код с тем же уровнем разрешений, что и ваш скрипт.eval('false')
,eval('FALSE')
произойдет ошибка.Вы можете использовать dict для преобразования строки в логическое значение. Измените эту строку
flag = bool(reader[0])
на:flag = {'True': True, 'False': False}.get(reader[0], False) # default is False
источник
Если вы хотите не учитывать регистр, вы можете просто сделать:
b = True if bool_str.lower() == 'true' else False
Пример использования:
>>> 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
источник
pip install str2bool
>>> from str2bool import str2bool >>> str2bool('Yes') True >>> str2bool('FaLsE') False
источник
Можно обойтись
json
.In [124]: import json In [125]: json.loads('false') Out[125]: False In [126]: json.loads('true') Out[126]: True
источник
Просто добавлю, что если ваше значение истины может варьироваться, например, если это ввод с разных языков программирования или разных типов, более надежным методом будет:
flag = value in ['True','true',1,'T','t','1'] # this can be as long as you want to support
И более производительный вариант будет (набор поиска - O (1)):
TRUTHS = set(['True','true',1,'T','t','1']) flag = value in truths
источник
Если ваши данные из json, вы можете сделать это
источник
Если вам нужен быстрый способ преобразовать строки в логические значения (которые работают с большинством строк), попробуйте.
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
источник
Использование dicts для преобразования "True" в True:
def str_to_bool(s: str): status = {"True": True, "False": False} try: return status[s] except KeyError as e: #logging
источник