Как проверить, пуста ли строка?
Есть ли в 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':