我正在从文件中读取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
。这种安排看起来非常复杂,因为这是一个来自更大代码的最小例子,这就是我将参数读入其中的方式。
为什么flag
始终转换为True
?
答案 0 :(得分:77)
bool('True')
和bool('False')
始终返回True
,因为字符串'True'和'False'不为空。
引用一个好人(和Python documentation):
5.1. Truth Value Testing
可以测试任何对象的真值,以便在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
答案 1 :(得分:56)
>>> import ast
>>> ast.literal_eval('True')
True
>>> ast.literal_eval('False')
False
为什么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)
答案 2 :(得分:48)
>>> 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
。
答案 3 :(得分:12)
我并不认为这是最佳答案,只是替代方案,但您也可以这样做:
flag = reader[0] == "True"
标志为True
ID读者[0]为“True”,否则为False
。
答案 4 :(得分:8)
我见过的最干净的解决方案是:
from distutils.util import strtobool
def string_to_bool(string):
return bool(strtobool(str(string)))
当然,它需要导入,但它具有正确的错误处理,并且只需要很少的代码来编写(和测试)。
答案 5 :(得分:6)
目前,它正在评估True
,因为该变量具有值。将任意类型作为布尔值进行求值时会发生good example found here。
简而言之,您要做的是隔离'True'
或'False'
字符串并在其上运行eval
。
>>> eval('True')
True
>>> eval('False')
False
答案 6 :(得分:5)
您可以使用dict将字符串转换为布尔值。将此行flag = bool(reader[0])
更改为:
flag = {'True': True, 'False': False}.get(reader[0], False) # default is False
答案 7 :(得分:2)
您可以使用json
。
In [124]: import json
In [125]: json.loads('false')
Out[125]: False
In [126]: json.loads('true')
Out[126]: True
答案 8 :(得分:1)
如果您想要不区分大小写,可以这样做:
(await page.$x("//table[@class='infobox']//th[contains(.,'Head')]/following-sibling::td/a"))[0]
使用示例:
b = True if bool_str.lower() == 'true' else False
答案 9 :(得分:0)
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.okhttp3:okhttp:3.5.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
compile 'com.squareup.okhttp3:logging-interceptor:3.5.0'
/*Firebase*/
compile 'com.google.firebase:firebase-messaging:11.0.0'
compile 'com.android.support:appcompat-v7:25.3.1'
compile 'com.android.support.constraint:constraint-layout:1.0.0-beta4'
compile 'com.android.support:design:25.3.1'
compile 'com.android.support:support-v4:25.3.1'
/*Header recyclerView*/
compile 'com.karumi:headerrecyclerview:1.1.0'
testCompile 'junit:junit:4.12'
/*Custom snackBar*/
compile 'com.androidadvance:topsnackbar:1.1.1'
/*google services*/
compile 'com.google.android.gms:play-services-location:11.0.0'
compile 'com.google.android.gms:play-services:11.0.0'
/*socket io*/
compile 'com.github.nkzawa:socket.io-client:0.3.0'
/*Map utils library*/
compile 'com.google.maps.android:android-maps-utils:0.5+'
compile 'org.greenrobot:eventbus:3.0.0'
compile 'com.google.guava:guava:16.0.1'
答案 10 :(得分:0)
如果您的数据来自json,则可以这样做
导入json
json.loads('true')
是
答案 11 :(得分:0)
如果您需要快速的方法将字符串转换为bool(大多数字符串都起作用),请尝试。
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
答案 12 :(得分:0)
只需补充一下,如果您的真值可以变化,例如,如果它是来自不同编程语言或不同类型的输入,则更可靠的方法是:
flag = value in ['True','true',1,'T','t','1'] # this can be as long as you want to support
一个性能更高的变体是(设置查找为O(1)):
TRUTHS = set(['True','true',1,'T','t','1'])
flag = value in truths
答案 13 :(得分:0)
使用字典将True转换为“ True”:
def str_to_bool(s: str):
status = {"True": True,
"False": False}
try:
return status[s]
except KeyError as e:
#logging
答案 14 :(得分:0)
如果你有
>>> my_value = "False"
然后要么做
>>> my_value in "False"
True
>>> my_value in "True"
False
或
>>> "False" in my_value
True
>>> "True" in my_value
False