Як перевірити, чи рядок порожній?


1415

Чи має Python щось на зразок порожньої змінної рядка, де ви можете:

if myString == string.empty:

Незалежно від того, який найелегантніший спосіб перевірити наявність порожніх рядкових значень? Мені важко кодувати ""кожен раз для перевірки порожнього рядка не настільки добре.


2
Як ""не так добре?
— NoName

Відповіді:


2112

Порожні рядки є " хибними", тобто в булевому контексті вони вважаються помилковими, тому ви можете просто зробити це:

if not myString:

Це кращий спосіб, якщо ви знаєте, що ваша змінна - це рядок. Якщо ваша змінна також може бути іншим типом, вам слід скористатися myString == "". Дивіться документацію щодо тестування істинної цінності щодо інших значень, які є бульними в булевих контекстах.


183
Будьте обережні, оскільки багато інших речей також неправдиві.
— Ігнасіо Васкес-Абрамс

9
Я ніколи раніше не чув про термін фальшивий. Це означає, що вона повертає помилкове значення?
— Джоан Венге

41
@Joan: у булевому контексті він оцінюється як помилковий.
— Ігнасіо Васкес-Абрамс

54
ОП хоче знати , якщо змінна є символом нового рядка, але ви також ввести if not myString:блок , якщо myStringбули None, 0, і Falseт.д. Так що, якщо ви не впевнені , який тип myString, ви повинні використовувати , if myString == "":щоб визначити , якщо це порожній рядок , на відміну від якась інша помилкова цінність.
— Ендрю Кларк

15
@AndrewClark, для такого випадку замість ланцюга if myString == ...виразів ми могли б використовувати if myString in (None, '')або per @Bartek,if myString in (None, '') or not myString.strip()
— Stew

411

З PEP 8 у розділі "Рекомендації щодо програмування" :

Для послідовностей (рядки, списки, кортежі) використовуйте той факт, що порожні послідовності є хибними.

Тож вам слід використовувати:

if not some_string:

або:

if some_string:

Просто для уточнення, послідовності оцінюються до Falseабо Trueв булевому контексті, якщо вони порожні чи ні. Вони не рівні до Falseабо True.


24
Чудово, що ви включили посилання на PEP!
— Фелікс

3
PS: На захист PEP можна стверджувати, що сказати " x - помилково " ("mal false" ) вже означає це, а не значення x == False. Але ІМХО уточнення все ще вітається, враховуючи цільову аудиторію.
— MestreLion

232

Найелегантніший спосіб, ймовірно, буде просто перевірити, чи справжній він чи хибний, наприклад:

if not my_string:

Однак ви можете позбавити білого простору, оскільки:

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

Ти, мабуть, повинен бути трохи більш чітким у цьому, окрім випадків, коли ти точно не знаєш, що ця рядок пройшла певну валідацію і є рядком, який можна перевірити таким чином.


87

Я би перевірив нікчемність перед тим, як знімати. Також я б використав той факт, що порожні рядки є хибними (або хибними). Цей підхід аналогічний StringUtils.isBlank Апача або Strings.isNullOrEmpty гуави в

Це те, що я хотів би використати для перевірки, чи рядок є "Ні" АБО "Порожній" чи "Порожній":

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

І, прямо протилежне тестуванню, якщо рядок не є None NOR Empty NOR Blank:

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()?
— Migol

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

Я колись написав щось подібне до відповіді Bartek та натхненного javascript:

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

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). Крім того, оскільки вони перевіряють особистість, єдина причина, чому вони працюють, полягає в тому, що Python використовує String Pooling (також званий String Internment), який використовує той самий екземпляр рядка, якщо він інтернований (див. Тут: Чому порівнюються рядки, використовуючи або '= = 'або' є 'іноді дають інший результат? ). І ""інтернований з самого початку в CPython

Велика проблема перевірки ідентичності полягає в тому, що String Internment - це, наскільки я міг знайти), що це не стандартизовано, які рядки інтерновані. Це означає, що теоретично ""не потрібно інтернованих, і це залежить від реалізації.

Єдиний спосіб зробити це , що на насправді не обдуриш це один згадувалося на початку: "".__eq__(myString). Оскільки це явно викликає __eq__()метод порожнього рядка, його не можна обдурити, замінивши будь-які методи в myString і твердо працює з підкласами str.

Також покладатися на хибність рядка може не спрацювати, якщо об'єкт переосмислить його __bool__()метод.

Це не тільки теоретична робота, але може бути актуальною і в реальному використанні, оскільки я бачив, як фреймворки та бібліотеки підкласифікуються strраніше, і використання myString is ""може повернути туди неправильний вихід.

Крім того, порівняння рядків, що використовують isзагалом, є досить злою пасткою, оскільки вона працюватиме правильно іноді, але не в інший час, оскільки об'єднання рядків дотримується досить дивних правил.

Зважаючи на це, у більшості випадків усі згадані рішення працюватимуть правильно. Це посада - це здебільшого наукова робота.


2
@simpleuser ви, звичайно, праві. У реальному світі цілком нормально використовувати хибність рядка або порівнювати його з порожнім рядком. Ця відповідь тут завищена за призначенням.
— Дакарон

дійсно, використовувати eq_ ?
— лодка

працює чудово, дякую!
— 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, це призведе до виключення. Більш ефективне використання @ Сейфа відповідь
— Dominik

9

Якщо ви хочете розмежувати порожні та нульові рядки, я б запропонував використовувати if len(string), інакше я б запропонував використовувати просто так, if stringяк сказали інші. Застереження щодо рядків, повних пробілу, все ще застосовується, тому не забувайте strip.


Я не знаю, чому ви хочете уникати використання "", якщо це якось не вплине на продуктивність, але я віддаю перевагу вашій відповіді на відповідь із мільйонами відгуків, оскільки це менш заплутано. Однак я хотів зазначити, що порожній список також є помилковим.
— Brōtsyorfuzthrāx

6

if stringname:дає a, falseколи рядок порожній. Я думаю, це не може бути простішим за це.


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

1
Дійсно не розумію, що це рішення отримує. Питання полягає в тестуванні того, чи рядок порожній. Якщо ви встановите, a='a'ви отримаєте a.isspace() -> False, але aне буде на цьому рахунку порожнім рядком.
— Адріан Кейстер

6

Я вважаю, що жорстке кодування (sic) "" кожного разу для перевірки порожнього рядка не так добре.

Підхід чистого коду

Робити це: foo == ""дуже погана практика. ""- це магічна цінність. Ніколи не слід перевіряти магічні значення (більш відомі як магічні числа) )

Що вам слід зробити, це порівняти з описовою назвою змінної.

Описові назви змінних

Можна подумати, що "empty_string" - це описова змінна назва. Це не так .

Перш ніж їхати і робити 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.

Це пояснюється тим, що вона поєднує бізнес-логіку (яким має бути значення CSV None) з реалізацією коду (з чим ми насправді порівнюємо)

Потрібно розмежувати проблеми між двома.


1
Чи справді потрібно піти на стільки проблем, щоб уникнути ""? Що в контексті порівняння, що ще може означати порожній рядок?

Коли я пишу у своїй відповіді, CSV не може представляти нуль без використання рядка. Якщо ви без контексту, то вітайте! Більшість кодів немає.
— firelynx

2
ви кажете, що "not_filled_in" є більш описовим, ніж "empty_string"? Я кажу, що ти високий.
— Tuncay Göncüoğlu

@ TuncayGöncüoğlu "Порожній рядок" не описує, для чого тест оператора if.
— firelynx

5
Я б не погодився з цією відповіддю. Магічні числа погані, це має сенс. Магічні значення також. Але ""це не магічне значення, яке є True, Falseабо Noneне є магічним значенням.
— Дакарон

5

Як щодо цього? Можливо, це не "найелегантніше", але це здається досить повним і зрозумілим:

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

Для більшості цілей рядок, що містить пробіли, не "порожній".
— Кріс Джонсон

Я припускаю, що ви маєте на увазі нічого, крім пробілу? Ви маєте на увазі моє використання strip ()? Для більшості цілей це порожнє! Смішно прийнято складати щось на кшталт s.trim (). IsEmpty ()
— BuvinJ

Привіт @Chris Johnson, чи ти бачив, що НАЙБІЛЬШЕ відповіді тут також використовують strip ()? Ви проголосували за всіх нас, або лише за мене?
— BuvinJ

4

Відповідаючи на @ 1290. На жаль, жодного способу форматування блоків у коментарях немає. NoneЗначення не порожня рядок в Python, і жоден (простору). Відповідь від Ендрю Кларка є правильним: 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

Відповідає вимогам @rouble, не порушуючи очікуваного bool поведінки рядків.


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змінну env.
— SilentVoid

2

Ще одним простим способом може бути визначення простої функції:

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

3
відповідь від кардамону є більш повною, якщо ми хочемо перевірити, чи є вхідним рядком чи ні
— tanzil

1
not str(myString)

Цей вираз вірно для порожніх рядків. Непорожні рядки, None та нерядкові об'єкти створюють False, застереження про те, що об'єкти можуть перекрити __str__, щоб перешкодити цій логіці, повернувши помилкове значення.




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

У випадку, якщо це комусь корисно, ось швидка функція, яку я створив для заміни пустих рядків N / A у списках списків (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

Це корисно для розміщення списків списків у базі даних mysql, яка не приймає пробілів для певних полів (поля, позначені NN у схемі. В моєму випадку це було пов’язано із складеним первинним ключем).


-1

Я робив кілька експериментів із рядками, такими як '', '', '\ n' і т. Д. Я хочу, щоб isNotWhitespace був істинним, якщо і лише тоді, коли змінний foo є рядком, що має принаймні один непробільний символ. Я використовую Python 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"(так само , як і очікувалося). Ваш код повертає те саме, за винятком порожнього рядка, він повертає True, що не повинно.
— AbcAeffchen

sry занадто стомлений: ваш код повертає False для порожнього рядка.
— AbcAeffchen

Цей код неправильний. Ви повертаєте помилково, якщо рядок порожній або немає.
— рубль
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.