Dizenin boş olup olmadığı nasıl kontrol edilir?


1417

Python'un yapabileceğiniz boş bir dize değişkeni gibi bir şeyi var mı:

if myString == string.empty:

Ne olursa olsun, boş dize değerlerini kontrol etmenin en zarif yolu nedir? Ben ""boş bir dize kadar iyi değil kontrol etmek için her zaman sert kodlama bulmak .


2
Nasıl ""iyi değil?
NoName

Yanıtlar:


2115

Boş dizeler "falsy" dir, yani Boole bağlamında yanlış kabul edilirler, böylece bunu yapabilirsiniz:

if not myString:

Değişkeninizin bir dize olduğunu biliyorsanız, tercih edilen yol budur. Değişkeniniz başka bir tür de olabilirse kullanmalısınız myString == "". Boole bağlamlarında yanlış olan diğer değerler için Doğruluk Değeri Testi ile ilgili belgelere bakın .


183
Dikkatli olun, çünkü diğer birçok şey de yanlıştır.
Ignacio Vazquez-Abrams

9
Daha önce hiç falsi terimini duymadım. Yanlış döndürdüğü anlamına mı geliyor?
Joan Venge

41
@Joan: Boole bağlamında yanlış olarak değerlendirilir.
Ignacio Vazquez-Abrams

54
OP değişken boş bir dize olup olmadığını bilmek istiyor, ama aynı zamanda girersiniz if not myString:eğer blok myStringvardı None, 0, Falsevb So Emin tipi gibi değilse myString, sen kullanmalısınız if myString == "":bunun aksine boş bir dize olup olmadığını belirlemek için başka bir falsi değeri.
Andrew Clark

15
@AndrewClark, böyle bir durum için, bir if myString == ...ifade zinciri yerine, if myString in (None, '')@Bartek, veya başına kullanabilirizif myString in (None, '') or not myString.strip()
Stew

413

Gönderen PEP 8 , içinde “Öneriler Programlama” bölümünde :

Diziler (dizeler, listeler, tuples) için boş dizilerin yanlış olduğu gerçeğini kullanın.

Yani kullanmalısınız:

if not some_string:

veya:

if some_string:

Sadece diziler vardır, açıklığa kavuşturmak için değerlendirilen için Falseya Trueda boş veya değilse bir Boole bağlamda. Bunlar eşit değildir etmek Falseveya True.


24
PEP'e referanslar eklemeniz harika!
Felix

3
PS: PEP'in savunmasında, " x yanlış " (küçük yanlış ) ifadesinin anlamdan ziyade zaten demek olduğu söylenebilir x == False. Ancak IMHO, hedef kitleye açıklık getirmeyi hala memnuniyetle karşılıyor.
MestreLion

233

En zarif yol muhtemelen gerçek ya da sahte olup olmadığını kontrol etmek olacaktır, örneğin:

if not my_string:

Bununla birlikte, beyaz alanı soymak isteyebilirsiniz, çünkü:

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

Bununla birlikte, bu dizenin bir tür doğrulamadan geçtiğinden ve bu şekilde test edilebilen bir dize olduğundan emin değilseniz, muhtemelen bu konuda biraz daha açık olmalısınız.


87

Sıyırmadan önce birliği test ederdim. Ayrıca, boş dizelerin False (veya Falsy) olduğu gerçeğini kullanırdım. Bu yaklaşım Apache's StringUtils.isBlank veya Guava's Strings.isNullOrEmpty'ye benzer.

Bir dize yok ya da boş ya da boş olup olmadığını sınamak için kullanacağım budur:

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

Ve, bir dizenin olmadığını test etmek için tam tersi Yok NOR Boş NOR Boş:

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

Yukarıdaki kodun daha özlü formları:

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

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

neden olmasın if mystring and not mystring.strip()?
Migol

1
Farkı string and not string.isspace()nedir?
Andrea Corbellini,

7
Bu tür şeyleri önemseyenler için daha özlü: def isBlank(s): return not (s and s.strip())ve def isNotBlank(s): return s and s.strip().
Carl

48

Bir keresinde Bartek'in cevabı ve ilham veren javascript'e benzer bir şey yazdım:

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

Ölçek:

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

Neden sadecereturn bool(s.strip())
anilbey

1
AttributeError: 'NoneType' object has no attribute 'strip'
kasa

28

Bunu yapmanın tek gerçekten sağlam yolu şudur:

if "".__eq__(myString):

Diğer tüm çözümlerde olası sorunlar ve denetimin başarısız olabileceği uç durumlar vardır.

len(myString)==0yöntemden myStringmiras alan strve geçersiz kılan bir sınıf nesnesi ise başarısız olabilir __len__().

Benzer şekilde myString == ""ve myString.__eq__("")eğer başarısız olabilir myStringgeçersiz kılar __eq__()ve __ne__().

Nedense geçersiz "" == myStringkılınırsa kandırılır .myString__eq__()

myString is ""ve "" is myStringeşdeğerdir. Her ikisi de myStringgerçekte bir dize değilse , ancak bir dize alt sınıfı değilse , her ikisi de başarısız olur False. Ayrıca, kimlik denetimleri olduklarından, çalışmalarının tek nedeni, Python'un, bir dizginin stajyedeyse aynı örneğini kullanan String Pooling'i (String Internment olarak da bilinir) kullanmasıdır (bkz. Neden : '= = 'veya' is 'bazen farklı bir sonuç üretir mi? ). Ve ""CPython'da en başından beri stajyer

Kimlik kontrolündeki en büyük problem, String Internment'ın (bulabildiğim kadarıyla), hangi dizelerin stajyerleştirildiğinin standartlaştırılmamış olmasıdır. Bu, teorik ""olarak zorunlu değildir ve uygulamaya bağlıdır.

Gerçekten aptal olamaz Bunu yapmanın tek yolu başlangıçta belirtilen biridir: "".__eq__(myString). Bu açıkça __eq__()boş dizenin yöntemini çağırdığından, myString'deki herhangi bir yöntem geçersiz kılınarak kandırılamaz ve str.

Ayrıca, nesne __bool__()yöntemini geçersiz kılarsa, bir dizenin yanlışlığına güvenmek işe yaramayabilir .

Bu sadece teorik bir çalışma değil, aynı zamanda gerçek kullanımla da ilgili olabilir, çünkü daha önce çerçeveler ve kütüphaneler alt sınıflarının olduğunu gördüm strve kullanmak myString is ""orada yanlış bir çıktı verebilir.

Ayrıca, dizeleri isgenel olarak kullanarak karşılaştırmak oldukça kötü bir tuzaktır, çünkü bazen doğru çalışacaktır, ancak diğer zamanlarda değil, dize havuzlaması oldukça garip kuralları izler.

Bununla birlikte, çoğu durumda belirtilen çözümlerin hepsi doğru şekilde çalışacaktır. Bu yazı çoğunlukla akademik çalışmadır.


2
@simpleuser elbette haklısın. Gerçek dünyada, ipin sahteliğini kullanmak veya boş bir dizeyle karşılaştırmak tamamdır. Buradaki cevap bilerek aşırıya kaçmış.
Dakkaron

gerçekten, eq_ ?
19:25, slboat

harika çalışıyor, teşekkür ederim!
eugene.polschikov

14

Boş veya boş dizeyi test edin (daha kısa yol):

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

7
Eğer myString = None, bir istisna doğuracaktır. @ Tonoz'un cevabı
Dominik

9

Boş ve boş dizeler arasında ayrım yapmak istiyorsanız , başkalarının söylediği gibi if len(string)kullanmanızı öneririm if string. Boşluklarla dolu dizelerle ilgili uyarı yine de geçerlidir, bu yüzden unutmayın strip.


Performansı bir şekilde etkilemediği sürece neden "" kullanmaktan kaçınmak istediğinizi bilmiyorum, ancak daha az kafa karıştırıcı olduğu için cevapları zvions upvotes olana tercih ederim. Ancak, boş bir listenin de Yanlış olduğunu belirtmek istedim.
Brōtsyorfuzthrāx

7

if stringname:falsedize boş olduğunda bir verir . Sanırım bundan daha basit olamaz.


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

1
Bu çözümün ne kazandığını gerçekten anlamıyorum. Soru, bir dizenin boş olup olmadığını test etmektir. Eğer belirlerseniz a='a'alırsınız a.isspace() -> False, ancak abu hesapta boş bir dize olmazsınız.
Adrian Keister

6

Boş kodları kontrol etmek için her zaman hardcoding (sic) "" buluyorum.

Temiz kod yaklaşımı

Bunu yapmak: foo == ""çok kötü bir uygulamadır. ""büyülü bir değerdir. Asla büyülü değerlere karşı kontrol etmemelisiniz (daha çok büyülü sayılar olarak bilinir )

Yapmanız gereken açıklayıcı bir değişken adıyla karşılaştırmaktır.

Açıklayıcı değişken adları

"Empty_string" ifadesinin tanımlayıcı bir değişken adı olduğu düşünülebilir. Değil .

Gitmek ve yapmak empty_string = ""ve karşılaştırmak için büyük bir değişken adınız olduğunu düşünüyorum önce . Bu "tanımlayıcı değişken adı" anlamına gelmez.

İyi bir tanımlayıcı değişken adı içeriğine dayanır. Sen boş dize düşünmek zorunda olduğunu .

  • Nereden geliyor.
  • Neden orada.
  • Neden kontrol etmeniz gerekiyor?

Basit form alanı örneği

Bir kullanıcının değer girebileceği bir form oluşturuyorsunuz. Kullanıcının bir şey yazıp yazmadığını kontrol etmek istiyorsunuz.

İyi bir değişken adı olabilir not_filled_in

Bu, kodu çok okunabilir hale getirir

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

Ayrıntılı CSV ayrıştırma örneği

CSV dosyalarını ayrıştırıyorsunuz ve boş dizenin şu şekilde ayrıştırılmasını istiyorsunuz None

(CSV tamamen metin tabanlı olduğundan, None önceden tanımlanmış anahtar kelimeler kullanılmadan edilemez)

İyi bir değişken adı olabilir CSV_NONE

Bu, Nonebaşka bir dizeyle temsil edilen yeni bir CSV dosyanız varsa kodun değiştirilmesini ve uyarlanmasını kolaylaştırır""

if csvfield == CSV_NONE:
    csvfield = None

Bu kod parçasının doğru olup olmadığı hakkında soru yoktur. Yapması gerekeni yaptığı oldukça açıktır.

Bunu şununla karşılaştır:

if csvfield == EMPTY_STRING:
    csvfield = None

Buradaki ilk soru, Boş ip neden özel muameleyi hak ediyor?

Bu, gelecekteki kodlayıcılara boş bir dizenin her zaman kabul edilmesi gerektiğini söyler None.

Bunun nedeni, iş mantığını (CSV değerinin ne olması gerektiği) karıştırmasıdır. None ) kod uygulamasıyla karıştırır (Aslında neyle karşılaştırıyoruz)

İkisi arasında endişe ayrılığı olmalı .


1
Bir "" önlemek için gerçekten bu kadar bela gitmek gerekiyor mu? Karşılaştırma bağlamında, boş bir dize başka ne anlama gelir?

Cevabımda yazarken, CSV bir dize kullanmadan null değerini temsil edemez. Bağlamdan özgürseniz tebrikler! Çoğu kod değil.
firelynx

2
"not_filled_in", "empty_string" den daha açıklayıcı mı diyorsunuz? Yüksek olduğunu söylüyorum.
Tuncay Göncüoğlu

@ TuncayGöncüoğlu "Boş dize" if ifadesinin ne için test ettiğini açıklamaz.
firelynx

5
Bu cevaba katılmıyorum. Sihirli sayılar kötü, bu mantıklı. Genel olarak sihirli değerler. Ama ""aynı sihirli değeri değil True, Falseya Nonesihirli değerler değildir.
Dakkaron

5

Buna ne dersin? Belki de "en zarif" değil, ama oldukça eksiksiz ve açık görünüyor:

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

Çoğu amaç için, boşluklar içeren bir dize "boş" değildir.
Chris Johnson

Sanırım beyaz boşluktan başka bir şey ifade etmiyor musunuz? Strip () kullanmamdan mı bahsediyorsun? Çoğu amaç için boştur! S.trim () gibi bir şeyi birleştirmek gülünç derecede yaygındır. İsEmpty ()
BuvinJ

Hey @Chris Johnson, buradaki cevapların ÇOK'unun strip () kullandığını gördünüz mü? Hepimize mi, yoksa sadece bana mı oy verdiniz?
BuvinJ

4

@ 1290'a yanıt vermek. Üzgünüz, yorumlarda blokları biçimlendirmenin bir yolu yok. NoneDeğeri Python boş bir dize değildir, ne de (boşluk) 'dir. Andrew Clark cevap doğru biridir: if not myString. @Rouble tarafından verilen yanıt uygulamaya özgüdür ve OP'nin sorusuna cevap vermez. Eğer "boş" bir dizgenin kendine özgü bir tanımını benimserseniz başınız belaya girer. Genellikle de, standart davranışı yani str(None)üretir'None' boş olmayan bir dize .

Ancak Noneve (boşlukları) "boş" dizeler olarak ele almanız gerekiyorsa , işte daha iyi bir yol:

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())

Örnekler:

>>> 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

boolDizelerin beklenen davranışlarını bozmadan @rouble gereksinimlerini karşılar .


python -c "if (str(None) == 'None'): print ('OMG, WHY ??')"
Yordan Georgiev

3

Bu bir dize olduğundan emin yapar ve uzunluğunu kontrol gibi zarif bulmak:

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

Uyarı, varsayımlar bir hata ayıklama aracıdır ve -Obayrağı PYTHONOPTIMIZEyapıştırırsanız veya env değişkenini ayarlarsanız optimize edilir .
SilentVoid

2

Başka bir kolay yol, basit bir işlevi tanımlamak olabilir:

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

3
girişin bir dize olup olmadığını kontrol etmek istiyorsak kakule cevabı daha eksiksiz
tanzil

1
not str(myString)

Bu ifade, boş olan dizeler için True'dur. Boş olmayan dizeler, Hiçbiri ve dizgisiz nesnelerin tümü Yanlış üretecek, nesnelerin bir falsy değeri döndürerek bu mantığı engellemek için __str__'yi geçersiz kılabileceği uyarısı.




0

Dosyayı satır satır okurken ve hangi satırın boş olduğunu belirlemek istediğinizde .strip(), "boş" satırda yeni satır karakteri olduğundan, kullanacağınızdan emin olun :

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

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

    # your code for non-empty lines

0
str = ""
if not str:
   print "Empty String"
if(len(str)==0):
   print "Empty String"

0

Eğer sadece

not var1 

boolean olan bir değişkeni Falseboş bir dizeden ayırt etmek mümkün değildir '':

var1 = ''
not var1
> True

var1 = False
not var1
> True

Ancak, betiğinize basit bir koşul eklerseniz, fark oluşur:

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

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

0

Bunun birisi için yararlı olması durumunda, burada boş dizeleri liste listelerinde N / A ile değiştirmek için inşa ettiğim hızlı bir işlev (python 2).

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

Bu, belirli listeler için boşlukları kabul etmeyen bir mysql veritabanına liste listeleri göndermek için yararlıdır (şemada NN olarak işaretlenmiş alanlar. Benim durumumda, bu bileşik bir birincil anahtardan kaynaklanıyordu).


-1

'', '', '\ N', vb. Gibi dizelerle bazı deneyler yaptım. Değişken foo en az bir boşluk olmayan karaktere sahip bir dize ise isNotWhitespace True olmasını istiyorum. Python 3.6 kullanıyorum. İşte sonuçta:

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

İsterseniz bunu bir yöntem tanımına sarın.


-3

Prmatta yukarıda yayınlanan gibi, ama yanlışlıkla.

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

Sadece test: His kod döner True ""ve " "için ve yanlış "a"(tıpkı beklenen). Kodunuz aynı döndürür, boş dize hariç True döndürür, neyi olmaması gerekir.
AbcAeffchen

sry too tired: Kodunuz boş dize için False değerini döndürür.
AbcAeffchen

Bu kod yanlış. Bir dize boşsa veya hiç değilse False değerini döndürürsünüz.
ruble
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.