Bagaimana cara memeriksa apakah string kosong?

1420

Apakah Python memiliki sesuatu seperti variabel string kosong yang dapat Anda lakukan:

if myString == string.empty:

Apapun, apa cara paling elegan untuk memeriksa nilai string kosong? Saya menemukan coding sulit ""setiap kali untuk memeriksa string kosong tidak sebagus.

Joan Venge
sumber
2
Bagaimana ""tidak sebagus itu?
NoName

Jawaban:

2117

String kosong adalah "falsy" yang berarti mereka dianggap salah dalam konteks Boolean, jadi Anda bisa melakukan ini:

if not myString:

Ini adalah cara yang disukai jika Anda tahu bahwa variabel Anda adalah string. Jika variabel Anda juga bisa menjadi tipe lain maka Anda harus menggunakan myString == "". Lihat dokumentasi tentang Pengujian Nilai Kebenaran untuk nilai-nilai lain yang salah dalam konteks Boolean.

Andrew Clark
sumber
183
Hati-hati, karena banyak hal lain juga salah.
Ignacio Vazquez-Abrams
9
Saya tidak pernah mendengar istilah falsy sebelumnya. Apakah ini berarti mengembalikan false?
Joan Venge
41
@ Joan: Mengevaluasi false dalam konteks boolean.
Ignacio Vazquez-Abrams
54
OP ingin tahu apakah variabel adalah string kosong, tetapi Anda juga akan memasukkan if not myString:blok jika myStringtidak None, 0, Falsedll Jadi jika Anda tidak yakin apa jenis myString, Anda harus menggunakan if myString == "":untuk menentukan apakah itu adalah string kosong sebagai lawan beberapa nilai palsu lainnya.
Andrew Clark
15
@AndrewClark, untuk kasus seperti itu, alih-alih rantai if myString == ...ekspresi, kita bisa menggunakan if myString in (None, '')atau per @Bartek,if myString in (None, '') or not myString.strip()
Stew
414

Dari PEP 8 , di bagian “Rekomendasi Pemrograman” :

Untuk urutan, (string, daftar, tupel), gunakan fakta bahwa urutan kosong salah.

Jadi, Anda harus menggunakan:

if not some_string:

atau:

if some_string:

Hanya untuk memperjelas, urutan dievaluasi ke Falseatau Truedalam konteks Boolean jika mereka kosong atau tidak. Mereka tidak sama dengan Falseatau True.

zenpoy
sumber
24
Hebat bahwa Anda memasukkan referensi ke PEP!
Felix
3
PS: Dalam pembelaan PEP, orang bisa berargumen bahwa mengatakan " x itu salah " (huruf kecil salah ) sudah berarti demikian, bukan makna x == False. Tapi IMHO klarifikasi masih diterima mengingat target audiens.
MestreLion
234

Cara yang paling elegan mungkin hanya dengan memeriksa apakah benar atau salah, misalnya:

if not my_string:

Namun, Anda mungkin ingin menghapus ruang putih karena:

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

Anda mungkin harus sedikit lebih eksplisit dalam hal ini, kecuali Anda tahu pasti bahwa string ini telah melewati semacam validasi dan merupakan string yang dapat diuji dengan cara ini.

Bartek
sumber
88

Saya akan menguji ketimpangan sebelum stripping. Juga, saya akan menggunakan fakta bahwa string kosong adalah False (atau Falsy). Pendekatan ini mirip dengan Apache StringUtils.isBlank atau Guava's Strings.isNullOrEmpty

Inilah yang akan saya gunakan untuk menguji apakah string adalah Tidak Ada ATAU Kosong ATAU Kosong:

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

Dan, kebalikan yang tepat untuk menguji jika sebuah string bukan None atau Kosong atau Kosong:

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

Bentuk kode di atas yang lebih ringkas:

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

def isNotBlank (myString):
    return bool(myString and myString.strip())
rubel
sumber
mengapa tidak if mystring and not mystring.strip()?
Migol
1
Bagaimana bedanya string and not string.isspace()?
Andrea Corbellini
7
Lebih ringkas bagi mereka yang peduli tentang hal-hal seperti itu: def isBlank(s): return not (s and s.strip())dan def isNotBlank(s): return s and s.strip().
Carl
49

Saya pernah menulis sesuatu yang mirip dengan jawaban Bartek dan terinspirasi javascript:

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

Uji:

print is_not_blank("")    # False
print is_not_blank("   ") # False
print is_not_blank("ok")  # True
print is_not_blank(None)  # False
kubah
sumber
Mengapa tidak sajareturn bool(s.strip())
anilbey
1
AttributeError: 'NoneType' object has no attribute 'strip'
lemari besi
28

Satu-satunya cara yang sangat solid untuk melakukan ini adalah sebagai berikut:

if "".__eq__(myString):

Semua solusi lain memiliki kemungkinan masalah dan kasus tepi di mana pemeriksaan dapat gagal.

len(myString)==0dapat gagal jika myStringobjek dari kelas yang mewarisi dari strdan menimpa__len__() metode.

Demikian pula myString == ""dan myString.__eq__("")dapat gagal jika myStringmenimpa __eq__()dan__ne__() .

Untuk beberapa alasan "" == myStringjuga tertipu jika myStringditimpa__eq__() .

myString is ""dan "" is myStringsetara. Keduanya akan gagal jika myStringsebenarnya bukan string tetapi subkelas string (keduanya akan kembali False). Juga, karena mereka memeriksa identitas, satu-satunya alasan mengapa mereka bekerja adalah karena Python menggunakan String Pooling (juga disebut String Internment) yang menggunakan instance string yang sama jika diinternir (lihat di sini: Mengapa membandingkan string menggunakan '= = 'atau' apakah 'terkadang menghasilkan hasil yang berbeda? ). Dan"" diinternir dari awal di CPython

Masalah besar dengan pemeriksaan identitas adalah bahwa String Internment adalah (sejauh yang saya bisa temukan) bahwa itu tidak standar string mana yang diinternir. Itu artinya, secara teoritis"" tidak perlu diinternir dan itu tergantung implementasi.

Satu-satunya cara untuk melakukan hal ini yang benar-benar tidak bisa tertipu adalah salah satu yang disebutkan di awal: "".__eq__(myString). Karena ini secara eksplisit menyebut __eq__()metode string kosong itu tidak dapat dibodohi dengan mengesampingkan metode apa pun di myString dan secara solid bekerja dengan subclass dari str.

Juga mengandalkan kepalsuan string mungkin tidak berfungsi jika objek menimpa __bool__()metode itu.

Ini bukan hanya pekerjaan teoretis tetapi mungkin sebenarnya relevan dalam penggunaan nyata karena saya telah melihat kerangka kerja dan perpustakaan subkelas strsebelumnya dan menggunakan myString is ""mungkin mengembalikan output yang salah di sana.

Juga, membandingkan penggunaan string issecara umum adalah jebakan yang cukup jahat karena kadang-kadang akan berfungsi dengan benar, tetapi tidak di waktu lain, karena penggabungan string mengikuti aturan yang cukup aneh.

Yang mengatakan, dalam banyak kasus semua solusi yang disebutkan akan bekerja dengan benar. Ini adalah posting sebagian besar karya akademis.

Dakkaron
sumber
2
@simpleuser Anda tentu saja benar. Di dunia nyata itu benar-benar ok untuk menggunakan kepalsuan string atau membandingkannya dengan string kosong. Jawaban di sini terlalu banyak sengaja.
Dakkaron
sungguh, gunakan eq_ ?
perahu layar
bekerja luar biasa, terima kasih!
eugene.polschikov
14

Tes string kosong atau kosong (cara yang lebih pendek):

if myString.strip():
    print("it's not an empty or blank string")
else:
    print("it's an empty or blank string")
prrvchr
sumber
7
Jika myString = None, itu akan memunculkan pengecualian. Lebih baik gunakan jawaban
Dominik
9

Jika Anda ingin membedakan antara string kosong dan nol, saya sarankan menggunakan if len(string), jika tidak, saya sarankan menggunakan hanya if stringseperti yang orang lain katakan. Peringatan tentang string penuh spasi masih berlaku, jadi jangan lupa strip.

Silas Ray
sumber
Saya tidak tahu mengapa Anda ingin menghindari penggunaan "", kecuali jika itu berdampak pada kinerja, tetapi saya lebih suka jawaban Anda dengan jawaban bervolume banyak karena kurang membingungkan. Namun, saya ingin menunjukkan bahwa daftar kosong juga False, rupanya.
Brōtsyorfuzthrāx
7

if stringname:memberi falseketika string kosong. Saya kira itu tidak bisa lebih sederhana dari ini.

Kakashi
sumber
7

Saya menemukan hardcoding (sic) "" setiap waktu untuk memeriksa string kosong tidak sebagus.

Pendekatan kode bersih

Melakukan ini: foo == ""adalah praktik yang sangat buruk. ""adalah nilai magis. Anda tidak boleh mengecek nilai magis (lebih dikenal sebagai angka ajaib )

Yang harus Anda lakukan adalah membandingkan dengan nama variabel deskriptif.

Nama variabel deskriptif

Orang mungkin berpikir bahwa "empty_string" adalah nama variabel deskriptif. Bukan itu .

Sebelum Anda pergi dan melakukan empty_string = ""dan berpikir Anda memiliki nama variabel yang bagus untuk dibandingkan. Ini bukan apa yang dimaksud dengan "nama variabel deskriptif".

Nama variabel deskriptif yang baik didasarkan pada konteksnya. Anda harus berpikir tentang apa string kosong itu .

  • Dari mana asalnya.
  • Kenapa disana?
  • Mengapa Anda perlu memeriksanya.

Contoh bidang formulir sederhana

Anda sedang membangun formulir di mana pengguna dapat memasukkan nilai. Anda ingin memeriksa apakah pengguna menulis sesuatu atau tidak.

Nama variabel yang baik mungkin not_filled_in

Ini membuat kode sangat mudah dibaca

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

Contoh parsing CSV menyeluruh

Anda mem-parsing file CSV dan ingin string kosong diuraikan sebagai None

(Karena CSV sepenuhnya berbasis teks, ia tidak dapat mewakili Nonetanpa menggunakan kata kunci yang ditentukan sebelumnya)

Nama variabel yang baik mungkin CSV_NONE

Ini membuat kode mudah diubah dan diadaptasi jika Anda memiliki file CSV baru yang mewakili Nonedengan string lain selain""

if csvfield == CSV_NONE:
    csvfield = None

Tidak ada pertanyaan tentang apakah kode ini benar. Cukup jelas bahwa ia melakukan apa yang seharusnya dilakukan.

Bandingkan ini dengan

if csvfield == EMPTY_STRING:
    csvfield = None

Pertanyaan pertama di sini adalah, Mengapa senar kosong pantas mendapat perlakuan khusus?

Ini akan memberi tahu coders masa depan bahwa string kosong harus selalu dianggap sebagai None.

Ini karena menggabungkan logika bisnis (Nilai CSV apa yang seharusnya None ) dengan implementasi kode (Apa yang sebenarnya kita bandingkan)

Perlu ada pemisahan kekhawatiran di antara keduanya.

firelynx
sumber
1
Apakah seseorang benar-benar harus pergi ke banyak masalah untuk menghindari ""? Dalam konteks perbandingan, apa lagi arti string kosong?
Saat saya menulis dalam jawaban saya, CSV tidak dapat mewakili nol tanpa menggunakan string. Jika Anda bebas konteks maka selamat! Sebagian besar kode tidak.
firelynx
2
Anda mengatakan "not_filled_in" lebih deskriptif daripada "empty_string"? Saya katakan Anda tinggi.
Tuncay Göncüoğlu
@ TuncayGöncüoğlu "String kosong" tidak menjelaskan untuk apa pernyataan pengujian.
firelynx
5
Saya tidak setuju dengan jawaban itu. Angka ajaib itu buruk, itu masuk akal. Nilai sihir secara umum juga. Tetapi ""bukan nilai sihir, sama dengan True, Falseatau Nonebukan nilai sihir.
Dakkaron
6
a = ''
b = '   '
a.isspace() -> False
b.isspace() -> True
Roman Semirook
sumber
1
Benar-benar tidak mengerti apa yang diuntungkan oleh solusi ini. Pertanyaannya adalah tentang menguji apakah suatu string kosong. Jika Anda mengatur a='a'Anda akan mendapatkan a.isspace() -> False, tetapi atidak akan menjadi string kosong pada akun itu.
Adrian Keister
5

Bagaimana dengan ini? Mungkin itu bukan "yang paling elegan", tetapi tampaknya cukup lengkap dan jelas:

if (s is None) or (str(s).strip()==""): // STRING s IS "EMPTY"...
Terima kasih
sumber
Untuk sebagian besar tujuan, string yang berisi kosong bukan "kosong".
Chris Johnson
Saya menganggap Anda tidak berarti apa-apa selain ruang putih? Anda mengacu pada penggunaan strip saya ()? Untuk sebagian besar tujuan, IS IS kosong! Sangat umum untuk menggabungkan sesuatu seperti s.trim (). IsEmpty ()
BuvinJ
Hei @ Chris Johnson, apakah Anda melihat bahwa sebagian besar jawaban di sini menggunakan strip () juga? Apakah Anda memilih kami semua, atau hanya saya?
BuvinJ
4

Menanggapi @ 1290. Maaf, tidak ada cara untuk memformat blok dalam komentar. The Nonenilai bukanlah string kosong di Python, dan tidak adalah (spasi). Jawaban dari Andrew Clark adalah yang benar: if not myString. Jawaban dari @rouble khusus untuk aplikasi dan tidak menjawab pertanyaan OP. Anda akan mendapat masalah jika Anda mengadopsi definisi khusus tentang apa yang merupakan string "kosong". Secara khusus, perilaku standar adalah yang str(None)menghasilkan'None' , string yang tidak kosong.

Namun jika Anda harus memperlakukan Nonedan (spasi) sebagai string "kosong", berikut adalah cara yang lebih baik:

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

Contoh:

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

Memenuhi persyaratan @rouble sambil tidak melanggar boolperilaku string yang diharapkan .

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

Saya menemukan ini elegan karena memastikan itu adalah string dan memeriksa panjangnya:

def empty(mystring):
    assert isinstance(mystring, str)
    if len(mystring) == 0:
        return True
    else:
        return False
kapulaga
sumber
Peringatan, menegaskan dimaksudkan sebagai alat debugging, dan dioptimalkan pergi jika Anda pas -Oflag atau mengatur PYTHONOPTIMIZEvariabel env.
SilentVoid
2

Cara mudah lainnya adalah dengan mendefinisikan fungsi sederhana:

def isStringEmpty(inputString):
    if len(inputString) == 0:
        return True
    else:
        return False
tanzil
sumber
3
jawaban dari kapulaga lebih lengkap jika kita ingin memeriksa apakah inputnya adalah string atau tidak
tanzil
1
not str(myString)

Ungkapan ini Benar untuk string yang kosong. String tidak kosong, Tidak ada dan objek non-string semua akan menghasilkan False, dengan peringatan bahwa objek dapat menimpa __str__ untuk menggagalkan logika ini dengan mengembalikan nilai falsy.

Fax
sumber
0

bagi mereka yang mengharapkan perilaku seperti apache StringUtils.isBlank atau Guava Strings.isNullOrEmpty :

if mystring and mystring.strip():
    print "not blank string"
else:
    print "blank string"
kommradHomer
sumber
0

Ketika Anda membaca file dengan baris dan ingin menentukan, baris mana yang kosong, pastikan Anda akan menggunakannya .strip(), karena ada karakter baris baru di baris "kosong":

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

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

    # your code for non-empty lines
Pavel Štěrba
sumber
0
str = ""
if not str:
   print "Empty String"
if(len(str)==0):
   print "Empty String"
Tanmoy Datta
sumber
0

Jika Anda hanya menggunakan

not var1 

tidak mungkin untuk membedakan variabel yang boolean Falsedari string kosong '':

var1 = ''
not var1
> True

var1 = False
not var1
> True

Namun, jika Anda menambahkan kondisi sederhana ke skrip Anda, perbedaan dibuat:

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

var1 = ''
not var1 and var1 != ''
> False
jberrio
sumber
0

Dalam hal ini berguna bagi seseorang, berikut adalah fungsi cepat yang saya buat untuk mengganti string kosong dengan N / A dalam daftar daftar (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

Ini berguna untuk mem-posting daftar daftar ke database mysql yang tidak menerima kosong untuk bidang tertentu (bidang ditandai sebagai NN dalam skema. Dalam kasus saya, ini karena kunci primer komposit).

FlyingZebra1
sumber
-1

Saya melakukan beberapa percobaan dengan string seperti '', '', '\ n', dll. Saya ingin isNotWhitespace menjadi Benar jika dan hanya jika variabel foo adalah string dengan setidaknya satu karakter non-spasi putih. Saya menggunakan Python 3.6. Inilah yang akhirnya saya dapatkan:

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

Bungkus ini dalam definisi metode jika diinginkan.

Tom Stambaugh
sumber
-3

Seperti prmatta diposting di atas, tetapi dengan kesalahan.

def isNoneOrEmptyOrBlankString (myString):
    if myString:
        if not myString.strip():
            return True
        else:
            return False
    return False
Bayangan
sumber
Baru diuji: Kodenya mengembalikan Benar untuk ""dan " "dan Salah untuk "a"(seperti yang diharapkan). Kode Anda mengembalikan yang sama, kecuali untuk string kosong mengembalikan Benar, apa yang seharusnya tidak.
AbcAeffchen
sry too lelah: Kode Anda mengembalikan False untuk string kosong.
AbcAeffchen
Kode ini salah. Anda mengembalikan False jika string kosong atau tidak ada.
rubel