将从文件读取的True/False值转换为boolean

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文件基本上由一个带有值的字符串组成TrueFalse写在里面.这种安排看起来非常复杂,因为这是一个来自更大代码的最小例子,这就是我将参数读入其中的方式.

为什么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)

  • 你可以通过`提高ValueError("不能将{}转换为bool".format(s))来使它成为一个"英雄"`ValueError`. (18认同)
  • 这可能是一个愚蠢的问题,但为什么`bool`只是没有将字符串'True`和`False`转换为布尔值`True`和`False`?似乎与`int`的行为不一致.我只是真的很好奇为什么我的推理是错误的,为什么另一个选择是决定. (3认同)
  • 每当比较字符串时,我都喜欢将案例展平(在适用的情况下)。例如我会使用: if s.upper() == 'TRUE': return True elif s.upper() == 'FALSE' return False (2认同)

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,on1; False值是n,no,f,false,off0.ValueError如果val是其他任何东西,则引发.

  • @AlexG 疯狂的是,一个名为“strtobool()”的函数实际上并不返回“bool” (15认同)
  • 更好的是,`bool(strtobool(my_string))`将输出转换为布尔值True/False变量 (12认同)
  • 请注意,“distutils”已被弃用,并将在 Python 3.12 中删除。 (4认同)

Ash*_*ary 57

用途ast.literal_eval:

>>> 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)

  • ast.literal_eval('false') 抛出一个异常,我认为这让它不太理想 (2认同)

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)

  • @samyi使用eval方法很危险.http://stackoverflow.com/questions/1832940/is-using-eval-in-python-a-bad-practice (3认同)
  • 供参考。这是一个糟糕的主意,你永远不应该使用“eval()”。在我看来,它应该从语言中删除。 (3认同)
  • 这是非常非常糟糕的,因为它是一个安全缺陷。如果您对文件中的原始数据使用“eval()”,则意味着对该文件具有写访问权限的任何人都可以在与您的脚本相同的权限级别上执行代码。 (2认同)

cal*_*leb 7

如果你想不区分大小写,你可以这样做:

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)


ndp*_*dpu 5

您可以使用dict将字符串转换为布尔值.将此行更改flag = bool(reader[0])为:

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


Rah*_*K P 5

你可以用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)