web-dev-qa-db-ja.com

ファイルから読み取られたTrue / False値をブール値に変換します

ファイルから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に変換されるのはなぜですか?

70
Gabriel

bool('True')bool('False')は常に文字列 'True'と 'False'が空ではないため、Trueを返します。

偉大な人を引用するには(およびPython ドキュメント ):

5.1。真理値テスト

Ifまたはwhile条件で使用するため、または以下のブール演算のオペランドとして使用するために、任意のオブジェクトの真理値をテストできます。次の値は偽と見なされます。

  • 00L0.00jなどの数値型のゼロ。
  • ''()[]などの空のシーケンス。

他のすべての値はtrueと見なされます—そのため、多くのタイプのオブジェクトは常にtrueです。

組み込みの 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
83
Nigel Tufnel

ast.literal_eval を使用します。

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

フラグが常に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)
55

distutils.util.strtobool を使用できます

>>> from distutils.util import strtobool

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

True値はyyesttrueonおよび1;です。 False値は、nnoffalseoff、および0です。 valがその他の場合、ValueErrorを発生させます。

52

私はこれを最良の答えとして提案するのではなく、単なる代替案ですが、次のようなこともできます:

flag = reader[0] == "True"

flagはTrueになります。idreader [0]は「True」です。それ以外の場合は、Falseになります。

12
elParaguayo

私が見た中で最もクリーンなソリューションは次のとおりです。

from distutils.util import strtobool
def string_to_bool(string):
    return bool(strtobool(str(string)))

確かに、それはインポートを必要としますが、適切なエラー処理を持ち、コードを書く(そしてテストする)必要はほとんどありません。

9
vpetersson

現在、変数に値があるため、Trueと評価されています。 ここにある良い例 は、任意の型をブール値として評価したときに何が起こるかを示しています。

要するに、あなたがしたいことは、'True'または'False'文字列を分離し、その上でevalを実行することです。

>>> eval('True')
True
>>> eval('False')
False
7
Gautam Joshi

Dictを使用して、文字列をブール値に変換できます。この行flag = bool(reader[0])を次のように変更します。

flag = {'True': True, 'False': False}.get(reader[0], False) # default is False
5
ndpu

大文字と小文字を区別しない場合は、次のようにします。

b = True if bool_str.lower() == 'true' else False

使用例:

>>> 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
2
caleb

jsonでできます。

In [124]: import json

In [125]: json.loads('false')
Out[125]: False

In [126]: json.loads('true')
Out[126]: True
2
Rahul K P

pip install str2bool

>>> from str2bool import str2bool
>>> str2bool('Yes')
True
>>> str2bool('FaLsE')
False
1
Symon

あなたのデータがjsonからのものであれば、あなたはそれを行うことができます

jSONをインポート

json.loads( 'true')

本当だ

文字列をブックに変換する簡単な方法(ほとんどの文字列で機能する)が必要な場合は試してください。

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

0
user6830669

真理値が変化する可能性がある場合、たとえば、それが異なるプログラミング言語または異なるタイプからの入力である場合に追加するだけで、より堅牢な方法は次のようになります。

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
0
Daniel Dubovski