我正在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
?
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
您可以
ValueError
通过执行raise ValueError("Cannot covert {} to a bool".format(s))
.选择这个是因为它不使用额外的包。谢谢你们!
“额外包裹”有什么问题?你指的是
ast
?它是标准库的一部分,所以它并不是真正的额外的。这可能是一个愚蠢的问题,但为什么
bool
只是没有转换的字符串True
和False
布尔值True
和False
?似乎是从什么行为不一致的行为int
。我真的很好奇为什么我的推理是错误的,为什么另一个选择是这个决定。每当比较字符串时,我都喜欢将案例展平(在适用的情况下)。例如我会使用: if s.upper() == 'TRUE': return True elif s.upper() == 'FALSE' return False