最优雅的方法来检查Python中的字符串是否为空?

时间:2012-03-05 20:09:24

标签: python string comparison-operators

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

if myString == string.empty:

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

25 个答案:

答案 0 :(得分:1704)

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

if not myString:

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

答案 1 :(得分:349)

来自PEP 8“Programming Recommendations” section

  

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

所以你应该使用:

if not some_string:

或:

if some_string:

只是澄清一下,如果序列是空的,那么序列在布尔上下文中被评估FalseTrue。它们不等于FalseTrue

答案 2 :(得分:194)

最优雅的方法可能是简单地检查它是真的还是假的,例如:

if not my_string:

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

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

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

答案 3 :(得分:70)

我会在剥离之前测试一下。另外,我会使用空字符串为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())

答案 4 :(得分:38)

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

答案 5 :(得分:12)

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

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

答案 6 :(得分:9)

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

答案 7 :(得分:6)

当字符串为空时,

if stringname:给出false。我想这不可能比这简单。

答案 8 :(得分:6)

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

答案 9 :(得分:6)

执行此操作的唯一真正可靠的方法是:

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比较字符串是一个非常邪恶的陷阱,因为它有时会正确运行,但在其他时候却无法正常工作,因为字符串池遵循非常奇怪的规则。

也就是说,在大多数情况下,所有提到的解决方案都将正确运行。这主要是学术工作。

答案 10 :(得分:5)

  

每次检查空字符串时都会发现硬编码(原文如此)。

清洁代码方法

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

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

描述性变量名称

有人可能会认为“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)与代码实现混合(我们实际比较的是什么)

两者之间需要separation of concern

答案 11 :(得分:3)

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

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

答案 12 :(得分: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行为。

答案 13 :(得分:1)

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

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

答案 14 :(得分:1)

下面是一种识别空字符串的简单方法:

a="" #Empty string
if(len(a)==0): #len() is used to find the length of the string or variable inside its' brackets.
   print("Empty")
else:
   print("Filled")

上面的 len()方法是一个内置函数,可帮助我们找到某个字符串或变量的长度。也可以用于列表。

逻辑::如果字符或变量的长度为0,则绝对表示字符串或变量为空。 但是请记住,这仅适用于字符串和列表,不适用于整数。下面是查找整数长度的代码。

a=int(input())
if(len(str(a))==0):
   print(True)

在上面的代码中, str()用于将int转换为字符串格式,例如从123到其字符串格式“ 123”。以字符串格式将是有效的。

答案 15 :(得分:0)

当您逐行读取文件并想确定哪一行是空的时,请确保使用.strip(),因为&#34中有新的行字符;为空"行:

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

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

    # your code for non-empty lines

答案 16 :(得分:0)

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

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

答案 17 :(得分:0)

not str(myString)

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

答案 18 :(得分:0)

<form method="get" action="">
  <p>Animals:
    <input type="checkbox" name="animals" value="cat">
    <input type="checkbox" name="animals" value="dog">
    <input type="checkbox" name="animals" value="bird">
    <input type="checkbox" name="animals" value="horse">
    <input type="text" name="animal" hidden>
  </p>
  <p><input type="text" name="country" placeholder="Country…"></p>
  <input type="submit" name="submit">  ←  Click to see the url where we should go
</form>

答案 19 :(得分: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

答案 20 :(得分:0)

如果这对某人有用,这是我构建的一种快速功能,可以用列表(Python 2)中的N / A替换空白字符串。

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

这对于将列表列表发布到不接受某些字段(在模式中标记为NN的字段。在我的情况下,这是由于复合主键的情况)的mysql数据库中很有用。

答案 21 :(得分:0)

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

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

答案 22 :(得分:0)

您可以查看此Assigning empty value or string in Python

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

答案 23 :(得分:-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()

根据需要将其包装在方法定义中。

答案 24 :(得分:-2)

如上所述prmatta,但有错误。

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