Преобразовать значение 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"флаг
TrueID 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