कन्वर्ट ट्रू / फाल्स वैल्यू रीड बाय फाइल टू बूलियन


86

मैं 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?


1
पाइप स्थापित str2bool
Symon

जवाबों:


100

bool('True')और bool('False')हमेशा लौटें Trueक्योंकि स्ट्रिंग्स 'ट्रू' और 'फाल्स' खाली नहीं हैं।

एक महान व्यक्ति (और पायथन प्रलेखन ) को उद्धृत करने के लिए :

5.1। सत्य मूल्य परीक्षण

किसी भी वस्तु का सत्य मूल्य के लिए परीक्षण किया जा सकता है, यदि वह या जबकि हालत में या नीचे बूलियन संचालन के संचालन के रूप में उपयोग किया जाता है। निम्नलिखित मूल्यों को गलत माना जाता है:

  • ...
  • किसी भी सांख्यिक प्रकार का शून्य, उदाहरण के लिए, 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

23
आप इसे करके "वीर" बना सकते ValueErrorहैं raise ValueError("Cannot covert {} to a bool".format(s))
सेठमॉर्टन

यह एक का चयन करने के बाद से यह कोई अतिरिक्त पैकेज का उपयोग करता है। धन्यवाद दोस्तों!
गेब्रियल

1
"अतिरिक्त पैकेज" में क्या गलत है? क्या आप जिक्र कर रहे हैं ast? यह मानक पुस्तकालय का हिस्सा है, इसलिए यह वास्तव में अतिरिक्त नहीं है।
सेठमोर्टन

4
यह एक मूर्खतापूर्ण प्रश्न हो सकता है, लेकिन यह boolसिर्फ तार Trueऔर Falseबूलियन मूल्यों में क्यों नहीं बदलता है Trueऔर False? क्या intकरता है से असंगत व्यवहार लगता है। मैं वास्तव में उत्सुक हूं कि मेरा तर्क गलत क्यों है और दूसरा विकल्प निर्णय क्यों था।
चार्ली पार्कर

1
जब भी मैं तार की तुलना करना चाहता हूं, तो मैं इस मामले को समतल करना चाहता हूं, (जहां लागू हो)। उदाहरण के लिए मैं उपयोग करूँगा: यदि s.upper () == 'TRUE': True elif s.upper () == 'FALSE' रिटर्न गलत
बिल किड

75

आप उपयोग कर सकते हैं 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और 0ValueErrorअगर घाटी कुछ और है तो उठाता है।


22
इससे भी बेहतर है, bool(strtobool(my_string))आउटपुट को बूलियन ट्रू / फाल्स वेरिएबल के रूप में कास्ट करना है
एलेक्सग

10
@AlexG पागल है कि एक समारोह कहा जाता strtobool()है, वास्तव में, एक नहीं हैbool
dericke

61

उपयोग करें ast.literal_eval:

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

झंडा हमेशा सच में क्यों परिवर्तित होता है?

पायथन में गैर-रिक्त तार हमेशा सही होते हैं।

संबंधित: सत्य मूल्य परीक्षण


यदि 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)

यह एक मूर्खतापूर्ण प्रश्न हो सकता है, लेकिन यह boolसिर्फ तार Trueऔर Falseबूलियन मूल्यों में क्यों नहीं बदलता है Trueऔर False? क्या intकरता है से असंगत व्यवहार लगता है। मैं वास्तव में उत्सुक हूं कि मेरा तर्क गलत क्यों है और दूसरा विकल्प निर्णय क्यों था।
चार्ली पार्कर

2
ast.literal_eval ('झूठा') एक अपवाद फेंकता है, जो मुझे लगता है कि यह कम वांछनीय है
क्रिस

@ क्रिस आप इसे सीधे उपयोग करने के बजाय कस्टम फ़ंक्शन में छोड़कर हमेशा कोशिश के आसपास लपेट सकते हैं।
अश्विनी चौधरी

@HewwoCraziness यह केवल किसी भी यादृच्छिक कोड नहीं अभिव्यक्ति अभिव्यक्त करता है।
अश्विनी चौधरी

15

सबसे साफ समाधान जो मैंने देखा है:

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

ज़रूर, इसके लिए एक आयात की आवश्यकता होती है, लेकिन इसमें उचित त्रुटि है और इसे लिखने (और जांचने) के लिए बहुत कम कोड की आवश्यकता होती है।


13

मुझे यह सबसे अच्छा जवाब, बस एक विकल्प के रूप में नहीं सुझाया गया है, लेकिन आप कुछ ऐसा भी कर सकते हैं:

flag = reader[0] == "True"

झंडा Trueआईडी रीडर होगा [0] "ट्रू" है, अन्यथा यह होगा False


10

वर्तमान में, यह मूल्यांकन कर रहा है Trueक्योंकि चर का मान है। यहाँ एक अच्छा उदाहरण है कि क्या होता है जब आप एक बूलियन के रूप में मनमाने प्रकार का मूल्यांकन करते हैं।

संक्षेप में, आप जो करना चाहते हैं, उसे 'True'या 'False'स्ट्रिंग को अलग करें और evalउस पर चलाएं ।

>>> eval('True')
True
>>> eval('False')
False

4
@samyi यह eval पद्धति का उपयोग करना खतरनाक है। stackoverflow.com/questions/1832940/…
M07

1
FYI करें। यह एक भयानक विचार है और आपको इसका उपयोग कभी नहीं करना चाहिए eval()। मेरी राय में, इसे भाषा से हटा दिया जाना चाहिए।
Nostalg.io

यह बहुत बहुत खराब है क्योंकि यह एक सुरक्षा दोष है। यदि आप eval()किसी फ़ाइल से कच्चे डेटा का उपयोग करते हैं तो इसका मतलब है कि कोई भी उस फ़ाइल तक पहुंच लिखने वाला आपकी स्क्रिप्ट के समान अनुमतियों के स्तर पर कोड निष्पादित कर सकता है।
कीथ रिप्ले

इसके अतिरिक्त, यदि मानों में सटीक अजगर वर्तनी नहीं है, उदाहरण के लिए eval('false'), eval('FALSE')यह त्रुटि करेगा।
केव

5

आप स्ट्रिंग को बूलियन में बदलने के लिए तानाशाही का उपयोग कर सकते हैं। इस पंक्ति flag = bool(reader[0])को इसमें बदलें :

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

5

यदि आप केस-असंवेदनशील होना चाहते हैं, तो आप बस कर सकते हैं:

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

3

पाइप स्थापित str2bool

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


2

बस यह जोड़ने के लिए कि यदि आपका सत्य मान भिन्न हो सकता है, उदाहरण के लिए यदि यह विभिन्न प्रोग्रामिंग भाषाओं से इनपुट है या विभिन्न प्रकार से है, तो अधिक मजबूत विधि होगी:

flag = value in ['True','true',1,'T','t','1'] # this can be as long as you want to support

और एक अधिक प्रदर्शन करने वाला संस्करण होगा (सेट लुकअप हे (1) है):

TRUTHS = set(['True','true',1,'T','t','1'])
flag = value in truths


0

यदि आपको स्ट्रिंग्स को बूल में बदलने के लिए त्वरित तरीके की आवश्यकता है (जो कि अधिकांश स्ट्रिंग्स के साथ कार्य करता है) प्रयास करें।

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

"ट्रू" को ट्रू में कन्वर्ट करने के लिए डक्ट्स का उपयोग करना:

def str_to_bool(s: str):
    status = {"True": True,
                "False": False}
    try:
        return status[s]
    except KeyError as e:
        #logging
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.