अगर स्ट्रिंग खाली है तो कैसे जांचें?


1414

क्या पायथन के पास एक रिक्त स्ट्रिंग चर जैसा कुछ है जहां आप कर सकते हैं:

if myString == string.empty:

भले ही, खाली स्ट्रिंग मानों की जांच करने का सबसे सुंदर तरीका क्या है? मुझे लगता है कि हार्ड ""स्ट्रिंग की जाँच के लिए हर बार हार्ड कोडिंग उतना अच्छा नहीं है।


1
कैसे ""अच्छा नहीं है?
NoName

जवाबों:


2108

खाली तार " मिथ्या " हैं जिसका अर्थ है कि उन्हें बूलियन संदर्भ में गलत माना जाता है, इसलिए आप ऐसा कर सकते हैं:

if not myString:

यह पसंदीदा तरीका है यदि आप जानते हैं कि आपका चर एक स्ट्रिंग है। अगर आपका वैरिएबल कुछ अन्य प्रकार का भी हो सकता है तो आपको उपयोग करना चाहिए myString == ""। अन्य मूल्यों के लिए सत्य मूल्य परीक्षण पर प्रलेखन देखें जो बूलियन संदर्भों में झूठे हैं।


183
सावधान रहें, क्योंकि बहुत सारी अन्य चीजें झूठी हैं।
इग्नासियो वाज़क्वेज़-अब्राम्स

9
मैंने पहले कभी झूठा शब्द नहीं सुना था। क्या इसका मतलब यह है कि यह गलत है?
जोन वेंज

41
@ जोआन: यह एक बूलियन संदर्भ में झूठ के रूप में मूल्यांकन करता है।
इग्नासियो वाज़केज़-अब्राम्स

54
ओपी यदि चर स्ट्रिंग खाली है जानना चाहता है, लेकिन आप यह भी दर्ज करेंगे if not myString:ब्लॉक करता है, तो myStringथे None, 0, Falseआदि तो तुम नहीं यकीन है कि किस प्रकार कर रहे हैं myStringहै, तो आप का उपयोग करना चाहिए if myString == "":अगर यह एक खाली स्ट्रिंग के रूप में करने का विरोध किया है निर्धारित करने के लिए कुछ अन्य मिथ्या मूल्य।
एंड्रयू क्लार्क

15
@AndrewClark, इस तरह के एक मामले के लिए, if myString == ...अभिव्यक्ति की एक श्रृंखला के बजाय , हम उपयोग कर सकते हैं if myString in (None, '')या प्रति @Bartek,if myString in (None, '') or not myString.strip()
Stew

411

से पीईपी 8 , में "अनुशंसाएँ प्रोग्रामिंग" अनुभाग :

अनुक्रमों के लिए, (स्ट्रिंग्स, सूचियों, ट्यूपल्स), इस तथ्य का उपयोग करें कि खाली क्रम झूठे हैं।

तो आपको उपयोग करना चाहिए:

if not some_string:

या:

if some_string:

बस स्पष्ट करने के लिए, दृश्यों रहे हैं का मूल्यांकन करने के लिए Falseया Trueएक बूलियन संदर्भ में अगर वे खाली है या नहीं कर रहे हैं। वे हैं बराबर नहीं करने के लिए Falseया True


24
PEP के संदर्भ में महान!
फेलिक्स

3
PS: PEP के बचाव में, कोई यह तर्क दे सकता है कि " x असत्य है " (लोअरकेस गलत ) का अर्थ पहले से ही है, बजाय अर्थ का x == False। लेकिन IMHO का स्पष्टीकरण अभी भी स्वागत योग्य है जो लक्षित दर्शकों को दिया गया है।
MestreLion

232

सबसे सुंदर तरीका शायद यह जांचना होगा कि क्या सही या गलत है, जैसे:

if not my_string:

हालाँकि, आप सफेद स्थान को छीनना चाह सकते हैं क्योंकि:

 >>> bool("")
 False
 >>> bool("   ")
 True
 >>> bool("   ".strip())
 False

आपको शायद इसमें थोड़ा और स्पष्ट होना चाहिए, लेकिन जब तक आप यह नहीं जानते कि यह स्ट्रिंग किसी प्रकार का सत्यापन कर चुकी है और एक स्ट्रिंग है जिसे इस तरह से परीक्षण किया जा सकता है।


87

मैं स्ट्रिपिंग से पहले नॉनसिटी का परीक्षण करूंगा। इसके अलावा, मैं इस तथ्य का उपयोग करूंगा कि खाली तार गलत (या झूठा) हैं। यह दृष्टिकोण अपाचे के StringUtils.isBlank या Guava के स्ट्रिंग्स के समान है ।isNullOfEpty

अगर मैं एक स्ट्रिंग या तो कोई भी खाली या खाली नहीं है, तो मैं यह परीक्षण करने के लिए उपयोग करूंगा:

def isBlank (myString):
    if myString and myString.strip():
        #myString is not None AND myString is not empty or blank
        return False
    #myString is None OR myString is empty or blank
    return True

और, यदि एक स्ट्रिंग NOR NOR खाली नहीं है

def isNotBlank (myString):
    if myString and myString.strip():
        #myString is not None AND myString is not empty or blank
        return True
    #myString is None OR myString is empty or blank
    return False

उपरोक्त कोड के अधिक संक्षिप्त रूप:

def isBlank (myString):
    return not (myString and myString.strip())

def isNotBlank (myString):
    return bool(myString and myString.strip())

क्यों नहीं if mystring and not mystring.strip()?
मिगोल

1
यह किस तरह से अलग है string and not string.isspace()?
एंड्रिया कोरबेलिनी

7
ऐसी बातों की परवाह करने वालों के लिए और अधिक संक्षिप्त: def isBlank(s): return not (s and s.strip())और def isNotBlank(s): return s and s.strip()
कार्ल

48

मैंने एक बार बार्टेक के उत्तर और जावास्क्रिप्ट से प्रेरित कुछ इसी तरह लिखा था:

def is_not_blank(s):
    return bool(s and s.strip())

परीक्षा:

print is_not_blank("")    # False
print is_not_blank("   ") # False
print is_not_blank("ok")  # True
print is_not_blank(None)  # False

सिर्फ क्यों नहींreturn bool(s.strip())
अनिलबाई

1
AttributeError: 'NoneType' object has no attribute 'strip'
तिजोरी

28

ऐसा करने का एकमात्र ठोस तरीका निम्नलिखित है:

if "".__eq__(myString):

अन्य सभी समाधानों में संभावित समस्याएं और किनारे मामले हैं जहां चेक विफल हो सकता है।

len(myString)==0विफल हो सकता है अगर myStringएक वर्ग का एक ऑब्जेक्ट है जो विरासत में मिला है strऔर __len__()विधि को ओवरराइड करता है।

इसी तरह myString == ""और myString.__eq__("")विफल हो सकता है अगर myStringओवरराइड __eq__()और __ne__()

किसी कारण से "" == myStringभी अगर मूर्ख बनाया जाता myStringओवरराइड __eq__()

myString is ""और "" is myStringबराबर हैं। वे दोनों विफल हो जाएंगे यदि myStringवास्तव में एक स्ट्रिंग नहीं है लेकिन स्ट्रिंग का एक उपवर्ग (दोनों वापस आ जाएंगे False)। इसके अलावा, चूंकि वे पहचान की जाँच करते हैं, केवल यही कारण है कि वे काम करते हैं, क्योंकि पायथन स्ट्रिंग स्ट्रिंग का उपयोग करता है (जिसे स्ट्रींग इंटरनेशन भी कहा जाता है) जो स्ट्रिंग के एक ही उदाहरण का उपयोग करता है यदि इसे इंटर्न किया जाता है (यहाँ देखें: क्यों या तो स्ट्रिंग का उपयोग करके तुलना करता है) = = 'या' कभी-कभी एक अलग परिणाम उत्पन्न होता है? )। और ""सीपीथॉन में शुरू से ही नजरबंद है

पहचान की जाँच के साथ बड़ी समस्या यह है कि स्ट्रिंग इन्टर्नमेंट (जहाँ तक मैं पा सकता था) कि यह मानकीकृत नहीं है कि कौन से तार नजरबंद हैं। इसका मतलब है कि सैद्धांतिक रूप ""से आवश्यक नहीं है और यह कार्यान्वयन पर निर्भर है।

इस है कि वास्तव में मूर्ख नहीं बनाया जा सकता है ऐसा करने का एक ही तरीका है शुरुआत में उल्लेख किया है: "".__eq__(myString)। चूंकि यह स्पष्ट रूप __eq__()से खाली स्ट्रिंग की विधि को कॉल करता है इसलिए इसे myString में किसी भी तरीके को ओवरराइड करके बेवकूफ नहीं बनाया जा सकता है और उपवर्गों के साथ ठोस रूप से काम करता है str

इसके अलावा अगर स्ट्रिंग का झूठापन पर भरोसा करना काम नहीं करता है यदि ऑब्जेक्ट इसकी __bool__()विधि से आगे निकल जाता है।

यह केवल सैद्धांतिक काम नहीं है, लेकिन वास्तव में वास्तविक उपयोग में प्रासंगिक हो सकता है क्योंकि मैंने strपहले से ही उपवर्गों और उपवर्गों को देखा है और myString is ""वहां एक गलत आउटपुट वापस कर सकता है।

इसके अलावा, isसामान्य रूप से तार का उपयोग करना एक बहुत बुरा जाल है क्योंकि यह कभी-कभी सही ढंग से काम करेगा, लेकिन अन्य समय पर नहीं, क्योंकि स्ट्रिंग पूलिंग बहुत ही अजीब नियमों का पालन करती है।

उस ने कहा, ज्यादातर मामलों में सभी उल्लिखित समाधान सही तरीके से काम करेंगे। यह पोस्ट ज्यादातर शैक्षणिक कार्य है।


2
@simpleuser आप निश्चित रूप से सही हैं। वास्तविक दुनिया में स्ट्रिंग के मिथ्यात्व का उपयोग करना या किसी खाली स्ट्रिंग से तुलना करना पूरी तरह से ठीक है। यह उत्तर उद्देश्य पर ओवरकिल है।
१२:

वास्तव में, eq_ का उपयोग करें ?
slboat

भयानक काम, धन्यवाद!
eugene.polschikov

14

परीक्षण खाली या रिक्त स्ट्रिंग (छोटा तरीका):

if myString.strip():
    print("it's not an empty or blank string")
else:
    print("it's an empty or blank string")

7
यदि myString = None, यह एक अपवाद बढ़ाएगा। बेहतर उपयोग @ तिजोरी का जवाब
डोमिनिक

9

यदि आप रिक्त और अशक्त स्ट्रिंग्स के बीच अंतर करना चाहते हैं, तो मैं उपयोग करने का सुझाव दूंगा if len(string), अन्यथा, मैं सुझाव दूंगा कि if stringजैसा कि दूसरों ने कहा है। व्हॉट्सएप से भरे तार के बारे में चेतावनी अभी भी लागू होती है, इसलिए इसे मत भूलना strip


मुझे नहीं पता कि आप "" का उपयोग करने से क्यों बचना चाहते हैं, जब तक कि यह किसी भी तरह प्रदर्शन को प्रभावित नहीं करता है, लेकिन मैं आपके उत्तर को अपवित्रों के साथ पसंद करता हूं, क्योंकि यह कम भ्रमित है। हालाँकि, मैं यह बताना चाहता था कि एक खाली सूची भी गलत है।
ब्रूट्सफोरोज़थ्रैक्स

6

if stringname:falseस्ट्रिंग खाली होने पर देता है। मुझे लगता है कि यह इससे आसान नहीं हो सकता।


6
a = ''
b = '   '
a.isspace() -> False
b.isspace() -> True

1
वास्तव में समझ में नहीं आता कि यह समाधान क्या है। प्रश्न परीक्षण के बारे में है कि क्या एक स्ट्रिंग खाली है। यदि आप सेट a='a'करते हैं तो आपको मिल जाएगा a.isspace() -> False, लेकिन aउस खाते पर एक खाली स्ट्रिंग नहीं होगी।
एड्रियन कीस्टर

6

मैं हार्डकॉक (सिक) ढूँढता हूँ "" हर बार एक खाली स्ट्रिंग की जाँच के लिए उतना अच्छा नहीं है।

साफ कोड दृष्टिकोण

ऐसा करना: foo == ""बहुत बुरा अभ्यास है। ""एक जादुई मूल्य है। आपको कभी भी जादुई मूल्यों के खिलाफ जांच नहीं करनी चाहिए (अधिक सामान्यतः जादुई संख्या के रूप में जाना जाता है )

आपको जो करना चाहिए वह एक वर्णनात्मक चर नाम से तुलना करता है।

वर्णनात्मक चर नाम

कोई सोच सकता है कि "खाली_स्ट्रिंग" एक वर्णनात्मक चर नाम है। यह नहीं है

इससे पहले कि आप जाएं और करें empty_string = ""और सोचें कि आपके पास तुलना करने के लिए एक महान चर नाम है। यह वह नहीं है जो "वर्णनात्मक चर नाम" का अर्थ है।

एक अच्छा वर्णनात्मक चर नाम इसके संदर्भ पर आधारित है। आपको यह सोचना होगा कि खाली स्ट्रिंग क्या है

  • यह कहां से आता है।
  • ऐसा क्यों है
  • आपको इसकी जांच करने की आवश्यकता क्यों है।

सरल रूप क्षेत्र उदाहरण

आप एक ऐसे फॉर्म का निर्माण कर रहे हैं, जहाँ उपयोगकर्ता मान दर्ज कर सकता है। आप जांचना चाहते हैं कि उपयोगकर्ता ने कुछ लिखा है या नहीं।

एक अच्छा चर नाम हो सकता है not_filled_in

यह कोड को बहुत पठनीय बनाता है

if formfields.name == not_filled_in:
    raise ValueError("We need your name")

संपूर्ण CSV का उदाहरण

आप CSV फ़ाइलों को पार्स कर रहे हैं और चाहते हैं कि रिक्त स्ट्रिंग को पार्स किया जाए None

(चूंकि CSV पूरी तरह से पाठ आधारित है, यह Noneपूर्वनिर्धारित कीवर्ड का उपयोग किए बिना प्रतिनिधित्व नहीं कर सकता है )

एक अच्छा चर नाम हो सकता है CSV_NONE

यदि आपके पास एक नई CSV फ़ाइल है जो Noneकिसी अन्य स्ट्रिंग के साथ प्रतिनिधित्व करती है, तो कोड को बदलना और अनुकूलित करना आसान बनाता है""

if csvfield == CSV_NONE:
    csvfield = None

यदि कोड का यह टुकड़ा सही है, तो इस बारे में कोई सवाल नहीं है। यह स्पष्ट है कि यह वही करता है जो उसे करना चाहिए।

इसकी तुलना करें

if csvfield == EMPTY_STRING:
    csvfield = None

यहां पहला सवाल यह है कि खाली स्ट्रिंग विशेष उपचार के लायक क्यों है?

यह भविष्य के कोडर्स को बताएगा कि एक खाली स्ट्रिंग को हमेशा माना जाना चाहिए None

ऐसा इसलिए है क्योंकि यह Noneकोड के कार्यान्वयन के साथ व्यापार तर्क (सीएसवी मूल्य क्या होना चाहिए ) को मिलाता है ( हम वास्तव में क्या तुलना कर रहे हैं)

वहाँ एक होने की जरूरत है चिंता की जुदाई दोनों के बीच।


1
क्या किसी को "" से बचने के लिए वास्तव में बहुत परेशानी में जाने की आवश्यकता है? तुलना के संदर्भ में रिक्त स्ट्रिंग का और क्या अर्थ हो सकता है?

जैसा कि मैंने अपने उत्तर में लिखा है, CSV स्ट्रिंग का उपयोग किए बिना नल का प्रतिनिधित्व नहीं कर सकता है। यदि आप संदर्भ मुक्त हैं तो बधाई! अधिकांश कोड नहीं है।
फायरक्लीनक्स

2
आप कहते हैं कि "not_filled_in" "blank_string" की तुलना में अधिक वर्णनात्मक है? मैं कहता हूं आप ऊंचे हैं।
टुनके गोनकुओलू

@ TuncayGöncüoğlu "खाली स्ट्रिंग" का वर्णन नहीं करता है कि क्या बयान के लिए परीक्षण करता है।
फायरलैक्स

5
मैं उस जवाब से असहमत होगा। मैजिक नंबर खराब हैं, जो समझ में आता है। सामान्य रूप में भी जादू का मूल्य। लेकिन ""एक जादू मूल्य नहीं है, उसी तरह True, Falseया Noneजादू मूल्य नहीं हैं।
डाककर्ण

5

इस बारे में कैसा है? शायद यह "सबसे सुरुचिपूर्ण" नहीं है, लेकिन यह बहुत पूर्ण और स्पष्ट लगता है:

if (s is None) or (str(s).strip()==""): // STRING s IS "EMPTY"...

अधिकांश उद्देश्यों के लिए, रिक्त युक्त स्ट्रिंग "रिक्त" नहीं है।
क्रिस जॉनसन

मेरा मानना ​​है कि आप सफेद जगह के अलावा कुछ नहीं करते हैं? आप मेरी पट्टी () का उपयोग करने की बात कर रहे हैं? अधिकांश उद्देश्यों के लिए जो खाली है! यह हास्यास्पद है कि s.trim () .Empty ()
BuvinJ

अरे @ क्रिस जॉनसन, क्या आपने देखा है कि यहाँ के जवाबों का MOST स्ट्रिप () का भी उपयोग करता है? क्या आपने हम सभी को, या सिर्फ मुझे वोट दिया?
BuvinJ

4

@ 1290 पर जवाब देना। क्षमा करें, टिप्पणियों में ब्लॉक प्रारूपित करने का कोई तरीका नहीं है। Noneमूल्य पायथन में एक खाली स्ट्रिंग नहीं है, और न (रिक्त स्थान) है। एंड्रयू क्लार्क का उत्तर सही है if not myString:। @Rouble से उत्तर एप्लिकेशन-विशिष्ट है और ओपी के प्रश्न का उत्तर नहीं देता है। यदि आप "रिक्त" स्ट्रिंग की एक अजीब परिभाषा को अपनाते हैं तो आप परेशानी में पड़ जाएंगे। विशेष रूप से, मानक व्यवहार यह है कि str(None)उत्पादन करता है 'None', एक गैर-रिक्त स्ट्रिंग।

हालांकि अगर आपको None"रिक्त" तार के रूप में व्यवहार करना चाहिए और (रिक्त स्थान), यहाँ एक बेहतर तरीका है:

class weirdstr(str):
    def __new__(cls, content):
        return str.__new__(cls, content if content is not None else '')
    def __nonzero__(self):
        return bool(self.strip())

उदाहरण:

>>> normal = weirdstr('word')
>>> print normal, bool(normal)
word True

>>> spaces = weirdstr('   ')
>>> print spaces, bool(spaces)
    False

>>> blank = weirdstr('')
>>> print blank, bool(blank)
 False

>>> none = weirdstr(None)
>>> print none, bool(none)
 False

>>> if not spaces:
...     print 'This is a so-called blank string'
... 
This is a so-called blank string

boolस्ट्रिंग्स के अपेक्षित व्यवहार को न तोड़ते हुए @rouble आवश्यकताओं को पूरा करता है ।


python -c "if (str(None) == 'None'): print ('OMG, WHY ??')"
योरदन जार्जियाव

3

मुझे यह बहुत खूबसूरत लगता है क्योंकि यह सुनिश्चित करता है कि यह एक स्ट्रिंग है और इसकी लंबाई की जांच करता है:

def empty(mystring):
    assert isinstance(mystring, str)
    if len(mystring) == 0:
        return True
    else:
        return False

चेतावनी, मुखर एक डिबगिंग उपकरण के रूप में होते हैं, और यदि आप -Oध्वज को पेस करते हैं या PYTHONOPTIMIZEएनवी चर सेट करते हैं , तो यह दूर हो जाता है ।
साइलेंटविओड

2

एक सरल कार्य को परिभाषित करने का एक और आसान तरीका हो सकता है:

def isStringEmpty(inputString):
    if len(inputString) == 0:
        return True
    else:
        return False

3
इलायची से उत्तर अधिक पूर्ण है अगर हम जांचना चाहते हैं कि इनपुट एक स्ट्रिंग है या नहीं
tanzil

1
not str(myString)

यह अभिव्यक्ति रिक्त स्ट्रिंग के लिए सही है। गैर-रिक्त स्ट्रिंग्स, कोई भी और गैर-स्ट्रिंग ऑब्जेक्ट्स सभी गलत का उत्पादन नहीं करेंगे, कैविटी के साथ कि ऑब्जेक्ट __str__ को गलत मानकर इस तर्क को विफल कर सकते हैं।


0

आप पायथन में इस मान को खाली मान या स्ट्रिंग पर देख सकते हैं

यह उन तारों की तुलना करने के बारे में है जो खाली हैं। इसलिए शून्यता के लिए परीक्षण के बजाय not, आप परीक्षण कर सकते हैं कि आपकी स्ट्रिंग खाली स्ट्रिंग के साथ रिक्त स्ट्रिंग के बराबर है ""...



0

जब आप लाइनों द्वारा फाइल पढ़ रहे हों और निर्धारित करना चाहते हों कि कौन सी लाइन खाली है, तो सुनिश्चित करें कि आप उपयोग करेंगे .strip(), क्योंकि "खाली" लाइन में नई लाइन कैरेक्टर है:

lines = open("my_file.log", "r").readlines()

for line in lines:
    if not line.strip():
        continue

    # your code for non-empty lines


0

अगर आप सिर्फ इस्तेमाल करते हैं

not var1 

किसी चर को Falseखाली स्ट्रिंग से अलग करना संभव नहीं है '':

var1 = ''
not var1
> True

var1 = False
not var1
> True

हालाँकि, यदि आप अपनी स्क्रिप्ट में एक साधारण शर्त जोड़ते हैं, तो अंतर बनता है:

var1  = False
not var1 and var1 != ''
> True

var1 = ''
not var1 and var1 != ''
> False

0

यदि यह किसी के लिए उपयोगी है, तो यहां एक त्वरित कार्य है जिसे मैं सूचियों की सूची (python 2) में N / A के साथ रिक्त तारों को बदलने के लिए बनाया गया हूं।

y = [["1","2",""],["1","4",""]]

def replace_blank_strings_in_lists_of_lists(list_of_lists):
    new_list = []
    for one_list in list_of_lists:
        new_one_list = []
        for element in one_list:
            if element:
                new_one_list.append(element)
            else:
                new_one_list.append("N/A")
        new_list.append(new_one_list)
    return new_list


x= replace_blank_strings_in_lists_of_lists(y)
print x

यह एक mysql डेटाबेस को सूचियों की सूची पोस्ट करने के लिए उपयोगी है जो कुछ क्षेत्रों के लिए रिक्त स्थान को स्वीकार नहीं करता है (मेरे मामले में स्कीमा में एनएन के रूप में चिह्नित फ़ील्ड, यह एक समग्र प्राथमिक कुंजी के कारण था)।


-1

मैंने कुछ प्रयोगों जैसे '', '', '\ n', आदि के साथ किया था, मैं चाहता हूं कि isNotWhitespace सच हो अगर और केवल चर foo कम से कम एक गैर-व्हाट्सएप चरित्र के साथ एक स्ट्रिंग है। मैं पायथन 3.6 का उपयोग कर रहा हूं। यहाँ मैंने क्या किया:

isWhitespace = str is type(foo) and not foo.strip()
isNotWhitespace = str is type(foo) and not not foo.strip()

यदि वांछित है तो इसे एक विधि परिभाषा में लपेटें।


-3

जैसा कि प्रमत्त ने ऊपर पोस्ट किया, लेकिन गलती से।

def isNoneOrEmptyOrBlankString (myString):
    if myString:
        if not myString.strip():
            return True
        else:
            return False
    return False

बस परीक्षण किया गया: उसका कोड लौटाता है ""और ( " "और "a"जैसा कि उम्मीद है) के लिए गलत है । आपका कोड वही देता है, खाली स्ट्रिंग को छोड़कर यह सही है, यह क्या नहीं होना चाहिए।
अबेकएफ़चेन

थका हुआ भी: आपका कोड खाली स्ट्रिंग के लिए गलत रिटर्न देता है।
AbcAeffchen

यह कोड गलत है। यदि कोई स्ट्रिंग खाली है या कोई नहीं है तो आप गलत लौटाते हैं।
रूबल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.