将从文件读取的真/假值转换为布尔值

我从文件中读取一个True - False值,我需要将其转换为布尔值。 目前它总是将其转换为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' 

file.dat文件基本上由一个内部写有TrueFalsestring组成。 这个安排看起来非常复杂,因为这是一个很大代码的最小例子,这就是我如何读取参数。

为什么flag总是转换为True

bool('True')bool('False')总是返回True因为string'True'和'False'不是空的。

引用一个伟大的人(和Python 文档 ):

5.1。 真值testing

任何对象都可以testing真值,用于if或while条件或者作为下面的布尔操作的操作数。 以下值被认为是错误的:

  • 任何数字types的零,例如0L0j
  • 任何空序列,例如''()[]

所有其他值都被认为是正确的 – 所以许多types的对象总是如此。

内置的boolfunction使用标准的真相testing程序。 这就是为什么你总是变得True

要将string转换为布尔值,您需要执行以下操作:

 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 

为什么国旗总是转换为真?

Python中非空string总是为True。

相关: 真值testing


如果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价值观是yyesttrueon1 ; False值是nnoffalseoff0 。 如果val是其他值,则引发ValueError

我不build议这是最好的答案,只是一个select,但你也可以做这样的事情:

 flag = reader[0] == "True" 

标志将是True ID阅读器[0]是“真”,否则将是False

你可以使用dict将string转换为布尔值。 将此行flag = bool(reader[0])更改为:

 flag = {'True': True, 'False': False}.get(reader[0], False) # default is False 

我见过的最干净的解决scheme是:

 from distutils.util import strtobool def string_to_bool(string): return bool(strtobool(str(string))) 

当然,它需要一个导入,但它有适当的error handling,并且需要很less的代码来写(和testing)。

目前,它正在计算为True因为该variables有一个值。 这里有一个很好的例子 ,当你评估任意types为布尔值时会发生什么。

总之,你想要做的是孤立'True''False'string,并在其上运行eval

 >>> eval('True') True >>> eval('False') False 

pip安装str2bool

 >>> from str2bool import str2bool >>> str2bool('Yes') True >>> str2bool('FaLsE') False