将从文件读取的真/假值转换为布尔值
我从文件中读取一个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
文件基本上由一个内部写有True
或False
string组成。 这个安排看起来非常复杂,因为这是一个很大代码的最小例子,这就是我如何读取参数。
为什么flag
总是转换为True
?
bool('True')
和bool('False')
总是返回True
因为string'True'和'False'不是空的。
引用一个伟大的人(和Python 文档 ):
5.1。 真值testing
任何对象都可以testing真值,用于if或while条件或者作为下面的布尔操作的操作数。 以下值被认为是错误的:
- …
- 任何数字types的零,例如
0L
,0j
。- 任何空序列,例如
''
,()
,[]
。- …
所有其他值都被认为是正确的 – 所以许多types的对象总是如此。
内置的bool
function使用标准的真相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
价值观是y
, yes
, t
, true
, on
和1
; False
值是n
, no
, f
, false
, off
和0
。 如果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