Как проверить, пуста ли строка?

Есть ли в Python что-то вроде пустой строковой переменной, где вы можете сделать:

if myString == string.empty:

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

Ответы

Ответ 1

Пустые строки "falsy" , что означает, что они считаются ложными в булевом контексте, поэтому вы можете просто сделать это:

if not myString:

Это предпочтительный способ, если вы знаете, что ваша переменная является строкой. Если вашей переменной может быть и другой тип, вы должны использовать myString == "". См. Документацию по Truth Value Testing для других значений, которые являются ложными в булевых контекстах.

Ответ 2

Из PEP 8 в разделе "Рекомендации по программированию" :

Для последовательностей (строки, списки, кортежи) используйте тот факт, что пустые последовательности являются ложными.

Итак, вы должны использовать:

if not some_string:

или

if some_string:

Чтобы уточнить, последовательности оцениваются до False или True в булевом контексте, если они пусты или нет. Они не равны до False или True.

Ответ 3

Самый элегантный способ, вероятно, состоял бы в том, чтобы просто проверить, действительно ли его истина или ложь, например:

if not my_string:

Однако вы можете удалить пробел, потому что:

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

Вероятно, вы должны быть немного более явными в этом, если вы точно не знаете, что эта строка прошла какую-то проверку и представляет собой строку, которая может быть проверена таким образом.

Ответ 4

Я проверил бы несоответствие перед снятием. Кроме того, я бы использовал тот факт, что пустые строки являются False (или Falsy). Этот подход похож на Apache StringUtils.isBlank или Guava 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())

Ответ 5

Однажды я написал что-то похожее на ответ Бартека и вдохновил 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

Ответ 6

Проверить пустую или пустую строку (более короткий путь):

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

Ответ 7

Если вы хотите различать пустые и нулевые строки, я бы предложил использовать if len(string), иначе я бы предложил просто if string, как говорили другие. Предупреждение о строках, заполненных пробелами, все равно применяется, поэтому не забудьте strip.

Ответ 8

 if my_string is '': print ('My string is EMPTY') # **footnote

Я думаю, что это то, к чему пытался добраться оригинальный постер... что-то, что читается как можно ближе к английскому и соответствует строгой практике программирования.

if my_string is '':
    print('My string is EMPTY')
else:
    print(f'My string is {my_string}')

Персонаж за характером Я думаю, что это хорошее решение.

Я отметил, что None не вступил в обсуждение, поэтому, добавив это и сжимая дальше, мы получим:

if my_string is '': print('My string is Empty')
elif my_string is None : print('My string.... isn\'t')
else: print(f'My string is {my_string}')

Ответ 9

Либо следующее

foo is ''

или даже

empty = ''
foo is empty

Ответ 10

Единственный действительно надежный способ сделать это заключается в следующем:

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), который использует тот же экземпляр строки, если он интернирован (см. Здесь: Почему при сравнении строк используется либо '= = 'или' is 'иногда дают другой результат?). И "" интернируется с самого начала в CPython

Большая проблема с проверкой идентичности состоит в том, что String Internment (насколько я мог найти) не стандартизирует, какие строки интернированы. Это означает, что теоретически "" не обязательно интернироваться, и это зависит от реализации.

Единственный способ сделать это, который действительно не может быть одурачен, - это тот, который упоминался в начале: "".__eq__(myString). Так как это явно вызывает метод __eq__() пустой строки, его нельзя одурачить, переопределив любые методы в myString, и он надежно работает с подклассами str.

Также полагаться на ложность строки может не сработать, если объект переопределяет __bool__().

Это не только теоретическая работа, но на самом деле может иметь отношение к реальному использованию, так как я уже видел, как фреймворки и библиотеки, подклассифицирующие str ранее, и использование myString is "" могут возвращать неверный вывод.

Кроме того, сравнение строк, используя is в целом является довольно злой ловушкой, так как он будет работать правильно, иногда, но не в другое время, так как строка Пулы следует довольно странным правилам.

Тем не менее, в большинстве случаев все упомянутые решения будут работать правильно. Это пост в основном академическая работа.

Ответ 11

if stringname: дает false, когда строка пуста. Я думаю, это не может быть проще, чем это.

Ответ 12

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

Ответ 13

Я нахожу жесткое кодирование (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) с реализацией кода (с чем мы на самом деле сравниваем)

Должно быть разделение проблем между ними.

Ответ 14

Как насчет этого? Возможно, это не "самый элегантный", но кажется довольно полным и ясным:

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

Ответ 15

Ответ на @1290. Извините, нет способа форматировать блоки в комментариях. Значение None не является пустой строкой в ​​Python, и ни одно из них (пробелы). Ответ от Эндрю Кларка правильный: if not myString. Ответ от @rouble зависит от приложения и не отвечает на вопрос OP. У вас возникнут проблемы, если вы примете своеобразное определение того, что такое "пустая" строка. В частности, стандартное поведение заключается в том, что 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.

Ответ 16

Я нахожу это элегантным, так как он проверяет, что это строка, и проверяет ее длину:

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

Ответ 17

То же самое у меня есть этот пример

if (string is None) or (str(string).strip()==""):

Ответ 18

Возможно, вы посмотрите на Назначение пустого значения или строки в Python

Это о сравнении пустых строк. Поэтому вместо проверки на пустоту с помощью not вы можете проверить, соответствует ли ваша строка пустой строке с "" пустой строкой...

Ответ 19

для тех, кто ожидает такое поведение, как apache StringUtils.isBlank или Guava Strings.isNullOrEmpty:

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

Ответ 20

Когда вы читаете файл по строкам и хотите определить, какая строка пуста, убедитесь, что вы будете использовать .strip(), потому что в "пустой" строке есть новый символ строки:

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

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

    # your code for non-empty lines

Ответ 21

not str(myString)

Это выражение True для пустых строк. Непустые строки, Нет и нестроковые объекты будут вызывать False, с оговоркой, что объекты могут переопределить __str__, чтобы сорвать эту логику, вернув значение фальши.

Ответ 22

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

Ответ 23

Если вы просто используете

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

Ответ 24

В случае, если это кому-то пригодится, я разработал быструю функцию замены пустых строк на 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 в схеме. В моем случае это произошло из-за составного первичного ключа).

Ответ 25

Другим простым способом может быть определение простой функции:

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

Ответ 26

Как сказал prmatta выше, но с ошибкой.

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

Ответ 27

В моем опыте тестирование для "" не всегда работает. Эти простые тесты всегда работали для меня:

if MyString == 'None'

или

if MyString != 'None'

Чтение электронной таблицы Excel. Я хочу остановиться, когда столбец пуст, используя следующий цикл while:

while str(MyString) != 'None':