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


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.