Преобразовать значение 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 56

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