Saya membaca True - False
nilai dari file dan saya perlu mengubahnya menjadi boolean. Saat ini selalu mengubahnya menjadi True
meskipun nilainya disetel ke False
.
Inilah MWE
yang saya coba lakukan:
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'
The file.dat
berkas pada dasarnya terdiri dari satu string dengan nilai True
atau False
dalam tertulis. Susunannya terlihat sangat berbelit-belit karena ini adalah contoh minimal dari kode yang jauh lebih besar dan begitulah cara saya membaca parameter di dalamnya.
Mengapa flag
selalu beralih ke True
?
Jawaban:
bool('True')
danbool('False')
selalu kembaliTrue
karena string 'True' dan 'False' tidak kosong.Mengutip orang hebat (dan dokumentasi Python ):
Fungsi built-in
bool
menggunakan prosedur pengujian kebenaran standar. Itulah mengapa Anda selalu mendapatkannyaTrue
.Untuk mengonversi string menjadi boolean, Anda perlu melakukan sesuatu seperti ini:
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
sumber
ValueError
dengan melakukanraise ValueError("Cannot covert {} to a bool".format(s))
.ast
? Ini adalah bagian dari pustaka standar, jadi tidak terlalu ekstra.bool
tidak mengubah stringTrue
danFalse
ke nilai booleanTrue
danFalse
? Tampaknya perilaku tidak konsisten dari apa yangint
dilakukannya. Saya hanya benar-benar ingin tahu mengapa alasan saya salah dan mengapa pilihan lain adalah keputusan.Kamu dapat memakai
distutils.util.strtobool
>>> from distutils.util import strtobool >>> strtobool('True') 1 >>> strtobool('False') 0
True
nilai-nilaiy
,yes
,t
,true
,on
dan1
;False
nilai-nilain
,no
,f
,false
,off
dan0
. MeningkatValueError
jika val adalah yang lain.sumber
bool(strtobool(my_string))
untuk mentransmisikan output sebagai variabel True / False booleanstrtobool()
tidak, pada kenyataannya, mengembalikan abool
Penggunaan
ast.literal_eval
:>>> import ast >>> ast.literal_eval('True') True >>> ast.literal_eval('False') False
String yang tidak kosong selalu True dalam Python.
Terkait: Pengujian Nilai Kebenaran
Jika NumPy adalah opsi, maka:
>>> 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)
sumber
bool
tidak mengubah stringTrue
danFalse
ke nilai booleanTrue
danFalse
? Tampaknya perilaku tidak konsisten dari apa yangint
dilakukannya. Saya hanya benar-benar ingin tahu mengapa alasan saya salah dan mengapa pilihan lain adalah keputusan.Solusi terbersih yang pernah saya lihat adalah:
from distutils.util import strtobool def string_to_bool(string): return bool(strtobool(str(string)))
Tentu, ini membutuhkan impor, tetapi memiliki penanganan kesalahan yang tepat dan hanya membutuhkan sedikit kode untuk ditulis (dan diuji).
sumber
ValueError
mengembalikan false.Saya tidak menyarankan ini sebagai jawaban terbaik, hanya alternatif tetapi Anda juga dapat melakukan sesuatu seperti:
flag = reader[0] == "True"
bendera akan menjadi
True
pembaca id [0] adalah "Benar", jika tidak maka akan demikianFalse
.sumber
Saat ini, itu sedang mengevaluasi
True
karena variabel memiliki nilai. Ada contoh bagus yang ditemukan di sini tentang apa yang terjadi saat Anda mengevaluasi jenis arbitrer sebagai boolean.Singkatnya, yang ingin Anda lakukan adalah mengisolasi string
'True'
atau'False'
dan menjalankannyaeval
.>>> eval('True') True >>> eval('False') False
sumber
eval()
. Menurut saya, itu harus dihapus dari bahasa.eval()
data mentah dari sebuah file, itu berarti siapa pun yang memiliki akses tulis ke file tersebut dapat mengeksekusi kode pada tingkat izin yang sama dengan skrip Anda.eval('false')
,eval('FALSE')
kesalahan akan terjadi.Anda dapat menggunakan dict untuk mengonversi string menjadi boolean. Ubah baris ini
flag = bool(reader[0])
menjadi:flag = {'True': True, 'False': False}.get(reader[0], False) # default is False
sumber
Jika Anda ingin peka huruf besar / kecil, Anda dapat melakukan:
b = True if bool_str.lower() == 'true' else False
Contoh penggunaan:
>>> 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
sumber
pip instal str2bool
>>> from str2bool import str2bool >>> str2bool('Yes') True >>> str2bool('FaLsE') False
sumber
Anda bisa melakukannya dengan
json
.In [124]: import json In [125]: json.loads('false') Out[125]: False In [126]: json.loads('true') Out[126]: True
sumber
Hanya untuk menambahkan bahwa jika nilai kebenaran Anda dapat bervariasi, misalnya jika itu adalah masukan dari bahasa pemrograman yang berbeda atau dari jenis yang berbeda, metode yang lebih kuat adalah:
flag = value in ['True','true',1,'T','t','1'] # this can be as long as you want to support
Dan varian yang lebih berkinerja adalah (set lookup is O (1)):
TRUTHS = set(['True','true',1,'T','t','1']) flag = value in truths
sumber
Jika data Anda dari json, Anda dapat melakukannya
sumber
Jika Anda membutuhkan cara cepat untuk mengubah string menjadi bools (yang berfungsi dengan sebagian besar string) coba.
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
sumber
Menggunakan dicts untuk mengubah "True" menjadi True:
def str_to_bool(s: str): status = {"True": True, "False": False} try: return status[s] except KeyError as e: #logging
sumber