Преобразовать значение True / False, считанное из файла, в логическое
я читаю True - False
значение из файла, и мне нужно преобразовать его в boolean. В настоящее время он всегда преобразует его в 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'
The в основном состоит из одной строки со значением True
или False
написано внутри. Расположение выглядит очень запутанным, потому что это минимальный пример из гораздо большего кода, и вот как я читаю параметры в него.
почему flag
всегда преобразовании в True
?
9 ответов:
bool('True')
иbool('False')
всегда возвращаетTrue
потому что строки 'True' и 'False' не пусты.процитировать великого человека (и питона документация):
5.1. Правда Испытания Значение
любой объект может быть проверен на истинностное значение, для использования в if или while условие или как операнд булевых операций ниже. Этот следующие значения считаются ложными:
- ...
- ноль любого числового типа, например,
0
,0L
,0.0
,0j
.- любая пустая последовательность, например,
''
,()
,[]
.- ...
все остальные значения считаются истинными-поэтому объекты многих типов всегда верны.
встроенный
bool
функция использует стандартную процедуру проверки истины. Вот почему вы всегда получаетеTrue
.чтобы преобразовать строку в boolean вам нужно сделать что-то вроде этого:
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
использовать
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)
можно использовать
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
если вал что-нибудь еще.
Я не предлагал это как лучший ответ, просто альтернатива, но вы также можете сделать что-то вроде:
flag = reader[0] == "True"
флаг
True
ID reader[0] является" True", в противном случае это будетFalse
.
В настоящее время он оценивается в
True
потому что переменная имеет значение. Там есть хороший пример нашли здесь что происходит, когда вы оцениваете произвольные типы как логические.короче, что вы хотите сделать, это изолировать
'True'
или'False'
строку и выполните командуeval
на нем.>>> eval('True') True >>> eval('False') False
самое чистое решение, которое я видел-это:
from distutils.util import strtobool def string_to_bool(string): return bool(strtobool(str(string)))
конечно, он требует импорта, но он имеет правильную обработку ошибок и требует очень мало кода для написания (и тестирования).
вы можете использовать dict для преобразования строки в логическое значение. Измените эту строку
flag = bool(reader[0])
to:flag = {'True': True, 'False': False}.get(reader[0], False) # default is False
pip install str2bool
>>> from str2bool import str2bool >>> str2bool('Yes') True >>> str2bool('FaLsE') 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