Gab*_*iel 74 python string boolean
我正在读取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'
Run Code Online (Sandbox Code Playgroud)
该file.dat文件基本上由一个带有值的字符串组成True或False写在里面.这种安排看起来非常复杂,因为这是一个来自更大代码的最小例子,这就是我将参数读入其中的方式.
为什么flag总是转换成True?
Nig*_*nel 85
bool('True')并且bool('False')总是返回,True因为字符串'True'和'False'不为空.
引用一个伟大的人(和Python 文档):
5.1.真值测试
可以测试任何对象的真值,用于if或while条件或作为下面布尔运算的操作数.以下值被视为false:
- ...
- 任何数字类型,例如零,
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
Run Code Online (Sandbox Code Playgroud)
Fra*_*aro 58
您可以使用 distutils.util.strtobool
>>> from distutils.util import strtobool
>>> strtobool('True')
1
>>> strtobool('False')
0
Run Code Online (Sandbox Code Playgroud)
True值是y,yes,t,true,on和1; False值是n,no,f,false,off和0.ValueError如果val是其他任何东西,则引发.
Ash*_*ary 57
>>> import ast
>>> ast.literal_eval('True')
True
>>> ast.literal_eval('False')
False
Run Code Online (Sandbox Code Playgroud)
为什么flag总是转换为True?
Python中的非空字符串始终为True.
相关:真值测试
如果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)
Run Code Online (Sandbox Code Playgroud)
elP*_*ayo 13
我不是建议这是最好的答案,只是另一种选择,但你也可以这样做:
flag = reader[0] == "True"
Run Code Online (Sandbox Code Playgroud)
flag将是Trueid reader [0]是"True",否则它将是False.
vpe*_*son 11
我见过的最干净的解决方案是:
from distutils.util import strtobool
def string_to_bool(string):
return bool(strtobool(str(string)))
Run Code Online (Sandbox Code Playgroud)
当然,它需要导入,但它具有正确的错误处理,并且只需要很少的代码来编写(和测试).
小智 7
目前,正在评估True因为变量具有值.这里有一个很好的例子,当你将任意类型作为布尔值进行求值时会发生什么.
简而言之,您要做的是隔离'True'或'False'字符串并eval在其上运行.
>>> eval('True')
True
>>> eval('False')
False
Run Code Online (Sandbox Code Playgroud)
如果你想不区分大小写,你可以这样做:
b = True if bool_str.lower() == 'true' else False
Run Code Online (Sandbox Code Playgroud)
用法示例:
>>> 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
Run Code Online (Sandbox Code Playgroud)
您可以使用dict将字符串转换为布尔值.将此行更改flag = bool(reader[0])为:
flag = {'True': True, 'False': False}.get(reader[0], False) # default is False
Run Code Online (Sandbox Code Playgroud)
你可以用json.
In [124]: import json
In [125]: json.loads('false')
Out[125]: False
In [126]: json.loads('true')
Out[126]: True
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
108713 次 |
| 最近记录: |