ファイルから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'と 'False'が空ではないため、True
を返します。
偉大な人を引用するには(およびPython ドキュメント ):
5.1。真理値テスト
Ifまたはwhile条件で使用するため、または以下のブール演算のオペランドとして使用するために、任意のオブジェクトの真理値をテストできます。次の値は偽と見なされます。
- …
0
、0L
、0.0
、0j
などの数値型のゼロ。''
、()
、[]
などの空のシーケンス。- …
他のすべての値は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
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)
distutils.util.strtobool
を使用できます
>>> 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
を発生させます。
私はこれを最良の答えとして提案するのではなく、単なる代替案ですが、次のようなこともできます:
flag = reader[0] == "True"
flagはTrue
になります。idreader [0]は「True」です。それ以外の場合は、False
になります。
私が見た中で最もクリーンなソリューションは次のとおりです。
from distutils.util import strtobool
def string_to_bool(string):
return bool(strtobool(str(string)))
確かに、それはインポートを必要としますが、適切なエラー処理を持ち、コードを書く(そしてテストする)必要はほとんどありません。
現在、変数に値があるため、True
と評価されています。 ここにある良い例 は、任意の型をブール値として評価したときに何が起こるかを示しています。
要するに、あなたがしたいことは、'True'
または'False'
文字列を分離し、その上でeval
を実行することです。
>>> eval('True')
True
>>> eval('False')
False
Dictを使用して、文字列をブール値に変換できます。この行flag = bool(reader[0])
を次のように変更します。
flag = {'True': True, 'False': False}.get(reader[0], False) # default is False
大文字と小文字を区別しない場合は、次のようにします。
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
json
でできます。
In [124]: import json
In [125]: json.loads('false')
Out[125]: False
In [126]: json.loads('true')
Out[126]: True
>>> from str2bool import str2bool
>>> str2bool('Yes')
True
>>> str2bool('FaLsE')
False
あなたのデータが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
真理値が変化する可能性がある場合、たとえば、それが異なるプログラミング言語または異なるタイプからの入力である場合に追加するだけで、より堅牢な方法は次のようになります。
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