Подтвердить что ты не робот

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

4b9b3361

Ответ 1

bool('True') и bool('False') всегда возвращают True потому что строки 'True' и 'False' не пусты.

Процитирую великого человека (и документацию по Python):

5.1. Тестирование Истинного Значения

Любой объект может быть проверен на значение истинности, для использования в условии 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

pip install str2bool

>>> 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