जवाबों:
खाली तार " मिथ्या " हैं जिसका अर्थ है कि उन्हें बूलियन संदर्भ में गलत माना जाता है, इसलिए आप ऐसा कर सकते हैं:
if not myString:
यह पसंदीदा तरीका है यदि आप जानते हैं कि आपका चर एक स्ट्रिंग है। अगर आपका वैरिएबल कुछ अन्य प्रकार का भी हो सकता है तो आपको उपयोग करना चाहिए myString == ""
। अन्य मूल्यों के लिए सत्य मूल्य परीक्षण पर प्रलेखन देखें जो बूलियन संदर्भों में झूठे हैं।
if not myString:
ब्लॉक करता है, तो myString
थे None
, 0
, False
आदि तो तुम नहीं यकीन है कि किस प्रकार कर रहे हैं myString
है, तो आप का उपयोग करना चाहिए if myString == "":
अगर यह एक खाली स्ट्रिंग के रूप में करने का विरोध किया है निर्धारित करने के लिए कुछ अन्य मिथ्या मूल्य।
if myString == ...
अभिव्यक्ति की एक श्रृंखला के बजाय , हम उपयोग कर सकते हैं if myString in (None, '')
या प्रति @Bartek,if myString in (None, '') or not myString.strip()
से पीईपी 8 , में "अनुशंसाएँ प्रोग्रामिंग" अनुभाग :
अनुक्रमों के लिए, (स्ट्रिंग्स, सूचियों, ट्यूपल्स), इस तथ्य का उपयोग करें कि खाली क्रम झूठे हैं।
तो आपको उपयोग करना चाहिए:
if not some_string:
या:
if some_string:
बस स्पष्ट करने के लिए, दृश्यों रहे हैं का मूल्यांकन करने के लिए False
या True
एक बूलियन संदर्भ में अगर वे खाली है या नहीं कर रहे हैं। वे हैं बराबर नहीं करने के लिए False
या True
।
x == False
। लेकिन IMHO का स्पष्टीकरण अभी भी स्वागत योग्य है जो लक्षित दर्शकों को दिया गया है।
सबसे सुंदर तरीका शायद यह जांचना होगा कि क्या सही या गलत है, जैसे:
if not my_string:
हालाँकि, आप सफेद स्थान को छीनना चाह सकते हैं क्योंकि:
>>> bool("")
False
>>> bool(" ")
True
>>> bool(" ".strip())
False
आपको शायद इसमें थोड़ा और स्पष्ट होना चाहिए, लेकिन जब तक आप यह नहीं जानते कि यह स्ट्रिंग किसी प्रकार का सत्यापन कर चुकी है और एक स्ट्रिंग है जिसे इस तरह से परीक्षण किया जा सकता है।
मैं स्ट्रिपिंग से पहले नॉनसिटी का परीक्षण करूंगा। इसके अलावा, मैं इस तथ्य का उपयोग करूंगा कि खाली तार गलत (या झूठा) हैं। यह दृष्टिकोण अपाचे के 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()
?
string and not string.isspace()
?
def isBlank(s): return not (s and s.strip())
और def isNotBlank(s): return s and s.strip()
।
मैंने एक बार बार्टेक के उत्तर और जावास्क्रिप्ट से प्रेरित कुछ इसी तरह लिखा था:
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())
AttributeError: 'NoneType' object has no attribute 'strip'
ऐसा करने का एकमात्र ठोस तरीका निम्नलिखित है:
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
सामान्य रूप से तार का उपयोग करना एक बहुत बुरा जाल है क्योंकि यह कभी-कभी सही ढंग से काम करेगा, लेकिन अन्य समय पर नहीं, क्योंकि स्ट्रिंग पूलिंग बहुत ही अजीब नियमों का पालन करती है।
उस ने कहा, ज्यादातर मामलों में सभी उल्लिखित समाधान सही तरीके से काम करेंगे। यह पोस्ट ज्यादातर शैक्षणिक कार्य है।
यदि आप रिक्त और अशक्त स्ट्रिंग्स के बीच अंतर करना चाहते हैं, तो मैं उपयोग करने का सुझाव दूंगा if len(string)
, अन्यथा, मैं सुझाव दूंगा कि if string
जैसा कि दूसरों ने कहा है। व्हॉट्सएप से भरे तार के बारे में चेतावनी अभी भी लागू होती है, इसलिए इसे मत भूलना strip
।
a = ''
b = ' '
a.isspace() -> False
b.isspace() -> True
a='a'
करते हैं तो आपको मिल जाएगा a.isspace() -> False
, लेकिन a
उस खाते पर एक खाली स्ट्रिंग नहीं होगी।
मैं हार्डकॉक (सिक) ढूँढता हूँ "" हर बार एक खाली स्ट्रिंग की जाँच के लिए उतना अच्छा नहीं है।
ऐसा करना: foo == ""
बहुत बुरा अभ्यास है। ""
एक जादुई मूल्य है। आपको कभी भी जादुई मूल्यों के खिलाफ जांच नहीं करनी चाहिए (अधिक सामान्यतः जादुई संख्या के रूप में जाना जाता है )
आपको जो करना चाहिए वह एक वर्णनात्मक चर नाम से तुलना करता है।
कोई सोच सकता है कि "खाली_स्ट्रिंग" एक वर्णनात्मक चर नाम है। यह नहीं है ।
इससे पहले कि आप जाएं और करें empty_string = ""
और सोचें कि आपके पास तुलना करने के लिए एक महान चर नाम है। यह वह नहीं है जो "वर्णनात्मक चर नाम" का अर्थ है।
एक अच्छा वर्णनात्मक चर नाम इसके संदर्भ पर आधारित है। आपको यह सोचना होगा कि खाली स्ट्रिंग क्या है ।
आप एक ऐसे फॉर्म का निर्माण कर रहे हैं, जहाँ उपयोगकर्ता मान दर्ज कर सकता है। आप जांचना चाहते हैं कि उपयोगकर्ता ने कुछ लिखा है या नहीं।
एक अच्छा चर नाम हो सकता है not_filled_in
यह कोड को बहुत पठनीय बनाता है
if formfields.name == not_filled_in:
raise ValueError("We need your name")
आप CSV फ़ाइलों को पार्स कर रहे हैं और चाहते हैं कि रिक्त स्ट्रिंग को पार्स किया जाए None
(चूंकि CSV पूरी तरह से पाठ आधारित है, यह None
पूर्वनिर्धारित कीवर्ड का उपयोग किए बिना प्रतिनिधित्व नहीं कर सकता है )
एक अच्छा चर नाम हो सकता है CSV_NONE
यदि आपके पास एक नई CSV फ़ाइल है जो None
किसी अन्य स्ट्रिंग के साथ प्रतिनिधित्व करती है, तो कोड को बदलना और अनुकूलित करना आसान बनाता है""
if csvfield == CSV_NONE:
csvfield = None
यदि कोड का यह टुकड़ा सही है, तो इस बारे में कोई सवाल नहीं है। यह स्पष्ट है कि यह वही करता है जो उसे करना चाहिए।
इसकी तुलना करें
if csvfield == EMPTY_STRING:
csvfield = None
यहां पहला सवाल यह है कि खाली स्ट्रिंग विशेष उपचार के लायक क्यों है?
यह भविष्य के कोडर्स को बताएगा कि एक खाली स्ट्रिंग को हमेशा माना जाना चाहिए None
।
ऐसा इसलिए है क्योंकि यह None
कोड के कार्यान्वयन के साथ व्यापार तर्क (सीएसवी मूल्य क्या होना चाहिए ) को मिलाता है ( हम वास्तव में क्या तुलना कर रहे हैं)
वहाँ एक होने की जरूरत है चिंता की जुदाई दोनों के बीच।
""
एक जादू मूल्य नहीं है, उसी तरह True
, False
या None
जादू मूल्य नहीं हैं।
इस बारे में कैसा है? शायद यह "सबसे सुरुचिपूर्ण" नहीं है, लेकिन यह बहुत पूर्ण और स्पष्ट लगता है:
if (s is None) or (str(s).strip()==""): // STRING s IS "EMPTY"...
@ 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 ??')"
मुझे यह बहुत खूबसूरत लगता है क्योंकि यह सुनिश्चित करता है कि यह एक स्ट्रिंग है और इसकी लंबाई की जांच करता है:
def empty(mystring):
assert isinstance(mystring, str)
if len(mystring) == 0:
return True
else:
return False
-O
ध्वज को पेस करते हैं या PYTHONOPTIMIZE
एनवी चर सेट करते हैं , तो यह दूर हो जाता है ।
एक सरल कार्य को परिभाषित करने का एक और आसान तरीका हो सकता है:
def isStringEmpty(inputString):
if len(inputString) == 0:
return True
else:
return False
आप पायथन में इस मान को खाली मान या स्ट्रिंग पर देख सकते हैं
यह उन तारों की तुलना करने के बारे में है जो खाली हैं। इसलिए शून्यता के लिए परीक्षण के बजाय not
, आप परीक्षण कर सकते हैं कि आपकी स्ट्रिंग खाली स्ट्रिंग के साथ रिक्त स्ट्रिंग के बराबर है ""
...
जो लोग अपाचे की तरह एक व्यवहार की अपेक्षा के लिए StringUtils.isBlank या अमरूद Strings.isNullOrEmpty :
if mystring and mystring.strip():
print "not blank string"
else:
print "blank string"
जब आप लाइनों द्वारा फाइल पढ़ रहे हों और निर्धारित करना चाहते हों कि कौन सी लाइन खाली है, तो सुनिश्चित करें कि आप उपयोग करेंगे .strip()
, क्योंकि "खाली" लाइन में नई लाइन कैरेक्टर है:
lines = open("my_file.log", "r").readlines()
for line in lines:
if not line.strip():
continue
# your code for non-empty lines
str = ""
if not str:
print "Empty String"
if(len(str)==0):
print "Empty String"
अगर आप सिर्फ इस्तेमाल करते हैं
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
यदि यह किसी के लिए उपयोगी है, तो यहां एक त्वरित कार्य है जिसे मैं सूचियों की सूची (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 डेटाबेस को सूचियों की सूची पोस्ट करने के लिए उपयोगी है जो कुछ क्षेत्रों के लिए रिक्त स्थान को स्वीकार नहीं करता है (मेरे मामले में स्कीमा में एनएन के रूप में चिह्नित फ़ील्ड, यह एक समग्र प्राथमिक कुंजी के कारण था)।
मैंने कुछ प्रयोगों जैसे '', '', '\ n', आदि के साथ किया था, मैं चाहता हूं कि isNotWhitespace सच हो अगर और केवल चर foo कम से कम एक गैर-व्हाट्सएप चरित्र के साथ एक स्ट्रिंग है। मैं पायथन 3.6 का उपयोग कर रहा हूं। यहाँ मैंने क्या किया:
isWhitespace = str is type(foo) and not foo.strip()
isNotWhitespace = str is type(foo) and not not foo.strip()
यदि वांछित है तो इसे एक विधि परिभाषा में लपेटें।
जैसा कि प्रमत्त ने ऊपर पोस्ट किया, लेकिन गलती से।
def isNoneOrEmptyOrBlankString (myString):
if myString:
if not myString.strip():
return True
else:
return False
return False
""
और ( " "
और "a"
जैसा कि उम्मीद है) के लिए गलत है । आपका कोड वही देता है, खाली स्ट्रिंग को छोड़कर यह सही है, यह क्या नहीं होना चाहिए।
""
अच्छा नहीं है?