如何检查字符串是否为空?


1414

Python是否有类似空字符串变量的内容,您可以在其中执行以下操作:

if myString == string.empty:

无论如何,检查空字符串值的最优雅方法是什么?我""每次都很难检查空字符串,因此很难进行编码。


1
怎么""不好?
NoName

Answers:


2108

空字符串是“ falsy”,这意味着它们在布尔上下文中被认为是错误的,因此您可以执行以下操作:

if not myString:

如果您知道变量是字符串,则这是首选方法。如果您的变量也可以是其他类型,则应使用myString == ""。有关在布尔上下文中为假的其他值,请参见“ 真值测试 ”文档。


183
要小心,因为许多其他事情也是错误的。
伊格纳西奥·巴斯克斯

9
我以前从未听说过虚假这个词。这是否意味着它返回false?
Joan Venge 2012年

41
@Joan:在布尔上下文中,其评估为false。
伊格纳西奥·巴斯克斯

54
OP希望知道变量是否为空字符串,但是如果还为,等,if not myString:则还要输入该块。因此,如果不确定类型是什么,则应使用它来确定它是否为空字符串,而不是其他一些虚假的价值。myStringNone0FalsemyStringif myString == "":
安德鲁·克拉克

15
@AndrewClark,在这种情况下,if myString == ...我们可以使用if myString in (None, '')或按@Bartek 来代替表达式链,if myString in (None, '') or not myString.strip()
Stew

411

PEP 8“编程建议”部分中

对于序列(字符串,列表,元组),请使用以下事实:空序列为假。

因此,您应该使用:

if not some_string:

要么:

if some_string:

只是为了澄清,序列评估FalseTrue在布尔上下文如果它们是空的或不是。他们不等于FalseTrue


24
太棒了,您包括对PEP的引用!
Felix

3
PS:在PEP的辩护中,有人可能会说说“ x是假的 ”(小写的false)已经意味着这个意思,而不是意思x == False。但是恕我直言,鉴于目标受众仍然希望对此做出澄清。
MestreLion

232

最优雅的方法可能是简单地检查其真实性或虚假性,例如:

if not my_string:

但是,您可能要删除空格,因为:

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

但是,您可能应该对此更加明确,除非您确定该字符串已经通过某种验证并且可以通过这种方式进行测试。


87

我会在剥离之前测试无。另外,我会使用一个空字符串为False(或Falsy)的事实。这种方法类似于Apache的StringUtils.isBlank番石榴的Strings.isNullOrEmpty

这就是我用来测试字符串是否为None或Empty或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

并且,与测试字符串是否不是None或NOR空或NOR空白完全相反:

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()呢?
米格尔2015年

1
string and not string.isspace()有何不同?
Andrea Corbellini 2015年

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_吗?
slboat

工作很棒,谢谢!
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,则会引发异常。更好地使用@vault的答案
多米尼克

9

如果要区分空字符串和空字符串,建议使用if len(string),否则,建议仅使用if string其他人所说的方法。关于充满空格的字符串的警告仍然适用,因此请不要忘记strip


我不知道您为什么要避免使用“”,除非它以某种方式影响性能,但是我更喜欢您的回答,因为它不计其数。但是,我想指出的是,一个空列表显然也是False。
Brōtsyorfuzthrāx

6

if stringname:false字符串为空时给出a 。我想这不可能比这更简单。



6

每次检查空字符串时,我都发现用硬编码“”不好。

干净的代码方法

这样做: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不能表示null。如果您没有上下文,那么恭喜您!大多数代码不是。
firelynx

2
您说“ not_filled_in”比“ empty_string”更具描述性?我说你很高。
TuncayGöncüoğlu

@TuncayGöncüoğlu“空字符串”没有描述if语句测试的内容。
firelynx19年

5
我不同意这个答案。魔术数字不好,这是有道理的。魔术值也是如此。但是,""是不是魔法值,相同TrueFalseNone不是魔法值。
达卡龙

5

这个怎么样?也许它不是“最优雅的”,但是看起来很完整和清晰:

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

在大多数情况下,包含空格的字符串不是“空”。
克里斯·约翰逊

我想你什么都没说,只是空格?您是指我对strip()的使用吗?在大多数情况下,它是空的!复合诸如s.trim()。isEmpty()之类的东西很荒谬,是
BuvinJ

嘿@克里斯·约翰逊,您是否看到这里的大多数答案也使用strip()?您否决了我们所有人,还是只有我?
BuvinJ

4

响应@ 1290。抱歉,无法格式化注释中的块。该None值在Python中不是空字符串,也不是(空格)。安德鲁·克拉克(Andrew Clark)的答案是正确的:if not myString。@rouble的答案是特定于应用程序的,不能回答OP的问题。如果您对“空白”字符串采用特殊定义,则会遇到麻烦。特别是,标准行为是str(None)产生'None'一个非空字符串。

但是,如果必须将Noneand(空格)视为“空白”字符串,这是一种更好的方法:

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 ??')"
Yordan Georgiev

3

我觉得这很优雅,因为它可以确保它是一个字符串并检查其长度:

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

警告,断言是一种调试工具,如果您粘贴该-O标志或设置PYTHONOPTIMIZEenv变量,它将得到优化。
SilentVoid19年

2

另一个简单的方法可能是定义一个简单的函数:

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

3
如果我们想检查输入是否为字符串,则来自豆蔻
果实的

1
not str(myString)

对于空字符串,此表达式为True。非空字符串,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'等字符串进行了一些实验。当且仅当变量foo是具有至少一个非空白字符的字符串时,我希望isNotWhitespace为True。我正在使用Python 3.6。我最终得到的是:

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

如果需要,可以将其包装在方法定义中。


-3

如prmatta上面所述,但有误。

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

刚刚测试:他的代码返回为真"",并" "与假的"a"(正如预期)。您的代码返回相同的内容,除了空字符串返回True(不应该返回True)。
2014年

太累了:您的代码为空字符串返回False。
AbcAeffchen 2014年

该代码是错误的。如果字符串为空或无,则返回False。
卢布2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.