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

时间:2014-02-12 15:26:16

标签: 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'

file.dat文件基本上由一个字符串组成,其中包含值TrueFalse。这种安排看起来非常复杂,因为这是一个来自更大代码的最小例子,这就是我将参数读入其中的方式。

为什么flag始终转换为True

15 个答案:

答案 0 :(得分:77)

bool('True')bool('False')始终返回True,因为字符串'True'和'False'不为空。

引用一个好人(和Python documentation):

  

5.1. Truth Value Testing

     

可以测试任何对象的真值,以便在if或while中使用   条件或下面的布尔运算的操作数。该   以下值被视为false:

     
      
  • ...
  •   
  • 任何数字类型的零,例如00L0.00j
  •   
  • 任何空序列,例如''()[]
  •   
  • ...
  •   
     

所有其他值都被认为是真的 - 所以很多类型的对象   总是如此。

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

使用ast.literal_eval

>>> import ast
>>> ast.literal_eval('True')
True
>>> ast.literal_eval('False')
False
  

为什么flag总是转换为True?

非空字符串在Python中始终为True。

相关:Truth Value 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)

答案 2 :(得分:48)

您可以使用distutils.util.strtobool

>>> from distutils.util import strtobool

>>> strtobool('True')
1
>>> strtobool('False')
0

True值为yyesttrueon1; False值为nnoffalseoff0。如果 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)

pip install str2bool

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