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

问题描述 投票:1144回答:26

Python是否有类似空字符串变量的地方,你可以这样做:

if myString == string.empty:

无论如何,检查空字符串值的最优雅方法是什么?我发现硬编码""每次都检查空字符串不太好。

python string comparison-operators
26个回答
1739
投票

空字符串是"falsy",这意味着它们在布尔上下文中被视为false,因此您可以这样做:

if not myString:

如果您知道您的变量是字符串,那么这是首选方法。如果您的变量也可能是其他类型,那么您应该使用myString == ""。有关布尔上下文中为false的其他值,请参阅Truth Value Testing上的文档。


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

5
投票

我发现硬编码(原文如此)“”每次检查空字符串都不太好。

Clean code approach

这样做:foo == ""是非常糟糕的做法。 ""是一个神奇的价值。你永远不应该检查魔法值(通常称为magical numbers

您应该做的是与描述性变量名称进行比较。

描述性变量名称

有人可能会认为“empty_string”是一个描述性的变量名。事实并非如此。

在你去之前做empty_string = ""并认为你有一个很好的变量名来比较。这不是“描述性变量名称”的含义。

一个好的描述性变量名称基于其上下文。你必须考虑空字符串是什么。

  • 它从何而来。
  • 为什么会这样。
  • 你为什么需要检查它。

Simple form field example

您正在构建一个用户可以输入值的表单。您想检查用户是否写了某些内容。

一个好的变量名称可能是not_filled_in

这使得代码非常易读

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

Thorough CSV parsing example

您正在解析CSV文件,并希望将空字符串解析为None

(由于CSV完全基于文本,因此在不使用预定义关键字的情况下无法表示None

一个好的变量名称可能是CSV_NONE

如果你有一个新的CSV文件代表None,而另一个字符串不是"",这使得代码很容易改变和适应

if csvfield == CSV_NONE:
    csvfield = None

关于这段代码是否正确,没有任何问题。很明显,它做了它应该做的事情。

比较这个

if csvfield == EMPTY_STRING:
    csvfield = None

这里的第一个问题是,为什么空绳需要特殊处理?

这将告诉未来的编码员空字符串应始终被视为None

这是因为它混合了业务逻辑(什么CSV值应该是None)和代码实现(我们实际比较的是什么)

两者之间需要有一个separation of concern


3
投票

回应@ 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行为。


3
投票

这个怎么样?也许它不是“最优雅的”,但似乎非常完整和清晰:

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

2
投票

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

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

0
投票

你可以看看这个Assigning empty value or string in Python

这是关于比较空的字符串。因此,不是用not测试空虚,你可以测试你的字符串是否等于空字符串与""空字符串...


0
投票

对于那些期望像apache StringUtils.isBlank或Guava Strings.isNullOrEmpty这样的行为的人:

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

0
投票

当您逐行读取文件并想要确定哪一行为空时,请确保使用.strip(),因为“empty”行中有新行字符:

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

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

    # your code for non-empty lines

0
投票
not str(myString)

对于空的字符串,此表达式为True。非空字符串,None和非字符串对象都将产生False,但需要注意的是,对象可以覆盖__str__以通过返回伪值来阻止此逻辑。


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

359
投票

来自PEP 8,在“Programming Recommendations” section

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

所以你应该使用:

if not some_string:

要么:

if some_string:

只是为了澄清,如果序列是空的,则在布尔上下文中对FalseTrue进行求值。它们不等于FalseTrue


0
投票

如果你只是使用

not var1 

从空字符串False中区分一个boolean ''变量是不可能的:

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的字段。在我的情况下,这是由于复合主键)。


0
投票

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

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

-2
投票

正如prmatta上面发布的那样,却有错误。

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

198
投票

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

if not my_string:

但是,您可能希望剥离空格,因为:

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

你可能应该更明确一点,除非你确定这个字符串已经通过了某种验证,并且是一个可以通过这种方式测试的字符串。


73
投票

我会在剥离之前测试一下。另外,我会使用空字符串为False(或Falsy)的事实。这种方法类似于Apache's StringUtils.isBlankGuava's 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

并且,如果字符串不是测试则完全相反无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())

39
投票

我曾经写过一些类似于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

12
投票

测试空或空字符串(更短的方式):

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

9
投票

如果你想区分空字符串和空字符串,我建议使用if len(string),否则,我建议使用简单的if string,正如其他人所说的那样。关于充满空白字符串的警告仍然适用,所以不要忘记strip


8
投票

这样做的唯一可靠方法如下:

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),如果它被实习则使用相同的字符串实例(请参阅此处:Why does comparing strings using either '==' or 'is' sometimes produce a different result?)。 ""从CPython开始实习

身份检查的一个大问题是String Internment是(据我所知),它没有标准化哪些字符串被实现。这意味着,理论上""不是必要的实体,而是依赖于实现。

真正不能被愚弄的唯一方法就是开头提到的那个:"".__eq__(myString)。由于这显式调用空字符串的__eq__()方法,因此不能通过覆盖myString中的任何方法来愚弄,并且可以与str的子类一起使用。

如果对象覆盖它的__bool__()方法,也依赖于字符串的虚假可能不起作用。

这不仅是理论上的工作,而且实际上可能与实际使用相关,因为我之前看到过使用str的框架和库继承myString is ""可能会在那里返回错误的输出。

此外,通常使用is比较字符串是一个非常邪恶的陷阱,因为它有时会正常工作,但在其他时候不会,因为字符串池遵循非常奇怪的规则。

也就是说,在大多数情况下,所有提到的解决方案都能正常工作。这篇文章主要是学术着作。


6
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.