Преобразовать значение True/False, считанное из файла, в boolean
Я читаю значение True - False
из файла, и мне нужно преобразовать его в boolean. В настоящее время он всегда преобразует его в True
, даже если значение установлено на False
.
Здесь a 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
?
Ответы
Ответ 1
bool('True')
и bool('False')
всегда возвращают True
потому что строки 'True' и 'False' не пусты.
Процитирую великого человека (и документацию по Python):
Любой объект может быть проверен на значение истинности, для использования в условии if или while или в качестве операнда нижеприведенных логических операций. Следующие значения считаются ложными:
- ...
- ноль любого числового типа, например,
0
, 0L
, 0.0
, 0j
. - любая пустая последовательность, например,
''
, ()
, []
. - ...
Все остальные значения считаются истинными, поэтому объекты многих типов всегда являются истинными.
Встроенная функция 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
Ответ 2
Используйте ast.literal_eval
:
>>> import ast
>>> ast.literal_eval('True')
True
>>> ast.literal_eval('False')
False
Почему флаг всегда преобразуется в True?
Непустые строки всегда 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)
Ответ 3
вы можете использовать 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 - что-то еще.
Ответ 4
Я не предлагаю это как лучший ответ, просто альтернатива, но вы также можете сделать что-то вроде:
flag = reader[0] == "True"
Флаг будет True
id reader [0] равен "True", иначе он будет False
.
Ответ 5
Самое чистое решение, которое я видел:
from distutils.util import strtobool
def string_to_bool(string):
return bool(strtobool(str(string)))
Конечно, для этого требуется импорт, но он имеет правильную обработку ошибок и требует, чтобы очень маленький код был написан (и протестирован).
Ответ 6
В настоящее время он оценивается как True
потому что переменная имеет значение. Здесь найден хороший пример того, что происходит, когда вы оцениваете произвольные типы как логические.
Короче говоря, вы хотите изолировать строку 'True'
или 'False'
и запустить на ней eval
.
>>> eval('True')
True
>>> eval('False')
False
Ответ 7
Вы можете использовать dict для преобразования строки в boolean. Измените эту строку flag = bool(reader[0])
на:
flag = {'True': True, 'False': False}.get(reader[0], False) # default is False
Ответ 8
Если вы хотите быть без учета регистра, вы можете просто сделать:
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
Ответ 9
Вы можете сделать с json
.
In [124]: import json
In [125]: json.loads('false')
Out[125]: False
In [126]: json.loads('true')
Out[126]: True
Ответ 10
>>> from str2bool import str2bool
>>> str2bool('Yes')
True
>>> str2bool('FaLsE')
False
Ответ 11
Если ваши данные из JSON, вы можете сделать это
импорт JSON
json.loads( 'истина')
Правда
Ответ 12
Если вам нужен быстрый способ конвертировать строки в bools (это работает с большинством строк), попробуйте.
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
Ответ 13
Просто добавьте, что если ваше значение истинности может варьироваться, например, если оно является вводом из разных языков программирования или из разных типов, более надежным методом будет:
flag = value in ['True','true',1,'T','t','1'] # this can be as long as you want to support
И более производительный вариант будет (set lookup O (1)):
TRUTHS = set(['True','true',1,'T','t','1'])
flag = value in truths