Como verificar se a string está vazia?


1420

O Python tem algo como uma variável de cadeia vazia, onde você pode fazer:

if myString == string.empty:

Independentemente disso, qual é a maneira mais elegante de verificar valores de string vazios? Acho sempre difícil codificar ""sempre que checar uma string vazia não é tão boa.


2
Como ""não é tão bom?
NoName

Respostas:


2117

Seqüências de caracteres vazias são "falsas", o que significa que são consideradas falsas em um contexto booleano; portanto, você pode fazer isso:

if not myString:

Essa é a maneira preferida se você souber que sua variável é uma sequência. Se a sua variável também puder ser de outro tipo, você deve usar myString == "". Consulte a documentação em Truth Value Testing para outros valores que são falsos em contextos booleanos.


183
Tenha cuidado, pois muitas outras coisas também são falsas.
Ignacio Vazquez-Abrams

9
Eu nunca ouvi falar do termo falsy antes. Isso significa que ele retorna falso?
Joan Venge

41
@ Joan: Avalia como falso em um contexto booleano.
Ignacio Vazquez-Abrams

54
OP quer saber se a variável é uma cadeia vazia, mas você também deve inserir o if not myString:bloco se myStringforam None, 0, Falseetc Então, se você não tiver certeza de que tipo myStringfor, você deve usar if myString == "":para determinar se ele é uma cadeia vazia em oposição a algum outro valor falso.
Andrew Clark

15
@AndrewClark, para tal caso, um, em vez de uma cadeia de if myString == ...expressões, poderíamos usar if myString in (None, '')ou por @Bartek,if myString in (None, '') or not myString.strip()
Stew

414

No PEP 8 , na seção "Recomendações de programação" :

Para seqüências (strings, listas, tuplas), use o fato de que sequências vazias são falsas.

Então você deve usar:

if not some_string:

ou:

if some_string:

Apenas para esclarecer, as seqüências são avaliadas para Falseou Trueem um contexto booleano se estiverem vazias ou não. Eles não são iguais a Falseou True.


24
Que bom que você incluiu referências ao PEP!
Felix

3
PS: Na defesa do PEP, pode-se argumentar que dizer " x é falso " (minúsculo falso ) já significa isso, ao invés de significado x == False. Mas IMHO o esclarecimento ainda é bem-vindo, dado o público-alvo.
MestreLion 12/03

234

A maneira mais elegante provavelmente seria simplesmente verificar se é verdadeiro ou falso, por exemplo:

if not my_string:

No entanto, convém remover o espaço em branco porque:

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

No entanto, você provavelmente deve ser um pouco mais explícito, a menos que saiba com certeza que essa sequência passou por algum tipo de validação e é uma sequência que pode ser testada dessa maneira.


88

Eu testaria a não-união antes de me despir. Além disso, eu usaria o fato de que cadeias vazias são falsas (ou falsas). Essa abordagem é semelhante à StringUtils.isBlank do Apache ou à Strings.isNullOrEmpty do Guava

Isto é o que eu usaria para testar se uma string é None OR Empty OR Blank:

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

E, exatamente o oposto para testar se uma string não é 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

Formas mais concisas do código acima:

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

def isNotBlank (myString):
    return bool(myString and myString.strip())

por que não if mystring and not mystring.strip()?
Migol 03/02

1
Qual é a diferença string and not string.isspace()?
Andrea Corbellini

7
Mais conciso para quem se importa com essas coisas: def isBlank(s): return not (s and s.strip())e def isNotBlank(s): return s and s.strip().
Carl

49

Certa vez, escrevi algo semelhante à resposta de Bartek e o javascript inspirou:

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

Teste:

print is_not_blank("")    # False
print is_not_blank("   ") # False
print is_not_blank("ok")  # True
print is_not_blank(None)  # False

Por que não apenasreturn bool(s.strip())
anilbey 03/03

1
AttributeError: 'NoneType' object has no attribute 'strip'
vault

28

A única maneira realmente sólida de fazer isso é a seguinte:

if "".__eq__(myString):

Todas as outras soluções têm possíveis problemas e casos extremos onde a verificação pode falhar.

len(myString)==0pode falhar se myStringfor um objeto de uma classe que herda stre substitui o __len__()método

Da mesma forma myString == ""e myString.__eq__("")pode falhar se myStringsubstituir __eq__()e __ne__().

Por alguma razão, "" == myStringtambém é enganado se for myStringsubstituído __eq__().

myString is ""e "" is myStringsão equivalentes. Ambos falharão se myStringnão for realmente uma string, mas uma subclasse de string (ambos retornarão False). Além disso, como são verificações de identidade, a única razão pela qual eles funcionam é porque o Python usa String Pooling (também chamado String Internment), que usa a mesma instância de uma string se for internada (veja aqui: Por que comparar cadeias usando '= = 'ou' é 'às vezes produz um resultado diferente? ). E"" é internado desde o início no CPython

O grande problema com a verificação de identidade é que o String Internment é (até onde eu pude encontrar) que não está padronizado quais strings são internadas. Isso significa que, teoricamente"" não é necessário internado e isso depende da implementação.

A única maneira de fazer isso que realmente não pode ser enganado é o mencionado no início: "".__eq__(myString). Como isso chama explicitamente o __eq__()método da string vazia, não pode ser enganado substituindo nenhum método em myString e trabalhando solidamente com subclasses de str.

Também depender da falsidade de uma string pode não funcionar se o objeto substituir o __bool__()método.

Este não é apenas um trabalho teórico, mas pode realmente ser relevante em uso real, já que eu vi estruturas e bibliotecas subclassificando strantes e usando, myString is ""podendo retornar uma saída errada lá.

Além disso, comparar seqüências de caracteres usando isem geral é uma armadilha bastante ruim, pois funcionará corretamente algumas vezes, mas não em outras, porque o pool de strings segue regras bastante estranhas.

Dito isto, na maioria dos casos, todas as soluções mencionadas funcionarão corretamente. Este post é principalmente um trabalho acadêmico.


2
@simpleuser, é claro que você está certo. No mundo real, é completamente aceitável usar a falsidade da string ou compará-la com uma string vazia. Essa resposta aqui é um exagero de propósito.
Dakkaron 14/10/19

realmente, use eq_ ?
slboat

trabalhando demais, obrigado!
eugene.polschikov

14

Teste a cadeia vazia ou em branco (maneira mais curta):

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

7
Se myString = None, isso gerará uma exceção. Melhor utilização de @ abóbada resposta
Dominik

9

Se você quiser diferenciar entre cadeias vazias e nulas, sugiro usar if len(string), caso contrário, sugiro usar simplesmente if stringcomo já foi dito. A ressalva sobre strings cheias de espaço em branco ainda se aplica, portanto, não esqueça strip.


Não sei por que você deseja evitar o uso de "", a menos que isso afete o desempenho, mas prefiro sua resposta àquela com zilhões de votos positivos, pois é menos confuso. No entanto, eu queria ressaltar que uma lista vazia também é falsa, aparentemente.
Brōtsyorfuzthrāx

7

if stringname:dá a falsequando a string está vazia. Eu acho que não pode ser mais simples que isso.


7

Eu acho que "" (sic) codificado permanentemente sempre que checar uma string vazia não é tão bom.

Abordagem de código limpo

Fazer isso: foo == ""é uma prática muito ruim. ""é um valor mágico. Você nunca deve verificar valores mágicos (mais conhecidos como números mágicos )

O que você deve fazer é comparar com um nome descritivo de variável.

Nomes de variáveis ​​descritivos

Pode-se pensar que "empty_string" é um nome de variável descritivo. Não é .

Antes de você ir e fazer empty_string = ""e achar que tem um ótimo nome de variável para comparar. Não é isso que "nome descritivo da variável" significa.

Um bom nome de variável descritiva é baseado em seu contexto. Você tem que pensar sobre o que a cadeia vazia é .

  • De onde isso vem.
  • Por que está aí?
  • Por que você precisa verificar isso?

Exemplo de campo de formulário simples

Você está criando um formulário em que um usuário pode inserir valores. Você deseja verificar se o usuário escreveu algo ou não.

Um bom nome de variável pode ser not_filled_in

Isso torna o código muito legível

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

Exemplo completo de análise de CSV

Você está analisando arquivos CSV e deseja que a sequência vazia seja analisada como None

Como o CSV é inteiramente baseado em texto, ele não pode ser representado Nonesem o uso de palavras-chave predefinidas.

Um bom nome de variável pode ser CSV_NONE

Isso facilita a alteração e a adaptação do código se você tiver um novo arquivo CSV que represente Noneoutra string que não""

if csvfield == CSV_NONE:
    csvfield = None

Não há dúvidas sobre se esse trecho de código está correto. É bastante claro que ele faz o que deve fazer.

Compare isso com

if csvfield == EMPTY_STRING:
    csvfield = None

A primeira pergunta aqui é: por que a string vazia merece tratamento especial?

Isso diria aos futuros codificadores que uma string vazia sempre deve ser considerada como None.

Isso ocorre porque ele combina a lógica de negócios (que valor CSV deve ser None ) com a implementação do código (com o que estamos realmente comparando)

É preciso haver uma separação de preocupações entre os dois.


1
Você realmente precisa se esforçar tanto para evitar um ""? No contexto da comparação, o que mais poderia significar uma string em branco?

Enquanto escrevo na minha resposta, o CSV não pode representar nulo sem usar uma string. Se você é livre de contexto, parabéns! A maioria dos códigos não é.
firelynx

2
você diz que "not_filled_in" é mais descritivo que "empty_string"? Eu digo que você está chapado.
Tuncay Göncüoğlu 15/04/19

@ TuncayGöncüoğlu "String vazia" não descreve o que a instrução if testa.
precisa saber é o seguinte

5
Eu discordaria dessa resposta. Números mágicos são ruins, isso faz sentido. Valores mágicos em geral também. Mas ""não é um valor mágico, mesmo que True, Falseou Nonenão são valores mágicos.
Dakkaron

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

1
Realmente não entendo o que essa solução ganha. A questão é testar se uma string está vazia. Se você definir a='a', obteria a.isspace() -> False, mas anão seria nessa conta uma string vazia.
Adrian Keister 11/03

5

Que tal agora? Talvez não seja "o mais elegante", mas parece bastante completo e claro:

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

Para a maioria dos propósitos, uma string contendo espaços em branco não está "vazia".
Chris Johnson

Eu suponho que você não quer dizer nada além de espaço em branco? Você está se referindo ao meu uso de strip ()? Para a maioria dos propósitos que está vazio! É ridiculamente comum a algo composto como s.trim () isEmpty ().
BuvinJ

Hey @ Chris Johnson, você viu que a maioria das respostas aqui também usa strip ()? Você votou para baixo em todos nós, ou apenas comigo?
precisa saber é o seguinte

4

Respondendo a @ 1290. Desculpe, não há como formatar blocos nos comentários. O Nonevalor não é uma string vazia no Python e nem é (espaços). A resposta de Andrew Clark é a correta: if not myString. A resposta de @rouble é específica do aplicativo e não responde à pergunta do OP. Você terá problemas se adotar uma definição peculiar do que é uma string "em branco". Em particular, o comportamento padrão é que str(None)produz'None' uma string não em branco.

No entanto, se você deve tratar Nonee (espaços) como seqüências de caracteres "em branco", aqui está uma maneira melhor:

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

Exemplos:

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

Atende aos requisitos @rouble, sem quebrar o boolcomportamento esperado das strings.


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

3

Acho isso elegante, pois garante que seja uma string e verifique seu comprimento:

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

Atenção, afirmações são uma ferramenta de depuração e são otimizadas se você passar o -Osinalizador ou definir a PYTHONOPTIMIZEvariável env.
SilentVoid 17/03/19

2

Outra maneira fácil seria definir uma função simples:

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

3
resposta de cardamomo é mais completa se queremos verificar se a entrada é uma string ou não
tanzil

1
not str(myString)

Essa expressão é verdadeira para cadeias vazias. Seqüências de caracteres não vazias, Nenhum e objetos que não sejam de seqüência de caracteres produzirão Falso, com a ressalva de que os objetos podem substituir __str__ para impedir essa lógica, retornando um valor falso.




0

Quando você estiver lendo o arquivo por linhas e quiser determinar qual linha está vazia, verifique se você usará .strip(), pois há um novo caractere de linha na linha "vazia":

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

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

    # your code for non-empty lines

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

0

Se você apenas usar

not var1 

não é possível diferenciar uma variável que é booleana Falsede uma string vazia '':

var1 = ''
not var1
> True

var1 = False
not var1
> True

No entanto, se você adicionar uma condição simples ao seu script, a diferença será feita:

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

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

0

Caso isso seja útil para alguém, aqui está uma função rápida criada para substituir cadeias de caracteres em branco por N / A em listas de listas (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

Isso é útil para postar listas de listas em um banco de dados mysql que não aceita espaços em branco para determinados campos (campos marcados como NN no esquema. No meu caso, isso ocorreu devido a uma chave primária composta).


-1

Eu fiz algumas experiências com seqüências de caracteres como '', '', '\ n' etc. etc. Quero que isNotWhitespace seja True se e somente se a variável foo for uma string com pelo menos um caractere que não seja um espaço em branco. Estou usando o Python 3.6. Aqui está o que eu acabei com:

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

Embrulhe isso em uma definição de método, se desejar.


-3

Como prmatta postado acima, mas com erro.

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

Acabado de testar: o código dele retorna True para ""e " "e False para "a"(exatamente como esperado). Seu código retorna o mesmo, exceto pela string vazia que retorna True, o que não deveria.
AbcAeffchen 2/11/2014

sry muito cansado: seu código retorna False para a string vazia.
AbcAeffchen

Este código está errado. Você retorna False se uma sequência estiver vazia ou nenhuma.
rublo
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.