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

Most elegant way to check if the string is empty in Python?

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

1
if myString == string.empty:

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


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

1
if not myString:

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


来自PEP 8的"编程建议"部分:

For sequences, (strings, lists, tuples), use the fact that empty sequences are false.

所以你应该用:

1
if not some_string:

或者:

1
if some_string:

为了澄清这一点,如果序列为空或不为空,则在布尔上下文中将序列计算为FalseTrue。它们不等于FalseTrue


最优雅的方法可能就是简单地查一下它是真的还是假的。

1
if not my_string:

但是,您可能想去掉空白,因为:

1
2
3
4
5
6
 >>> bool("")
 False
 >>> bool("  ")
 True
 >>> bool("  ".strip())
 False

但是,您可能应该在这方面更加明确一些,除非您确定这个字符串已经通过某种验证,并且是一个可以通过这种方式测试的字符串。


在剥皮前我要测试一下是否为零。此外,我将使用空字符串为False(或Falsy)的事实。这种方法类似于Apache的StringUtils。isBlank或Guava's Strings.isNullOrEmpty

这是我用来测试一个字符串是空的还是空的:

1
2
3
4
5
6
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

并且,与测试字符串是否为空或非空正好相反:

1
2
3
4
5
6
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

以上代码的更简洁形式:

1
2
3
4
5
def isBlank (myString):
    return not (myString and myString.strip())

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


我曾经写过类似Bartek的答案和javascript的灵感:

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

测试:

1
2
3
4
print is_not_blank("")    # False
print is_not_blank("  ") # False
print is_not_blank("ok")  # True
print is_not_blank(None)  # False

测试空字符串或空白字符串(较短的方法):

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


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


1
if my_string is '':

我没有在任何一个答案中注意到这种特殊的组合。我寻找

1
is ''

在答案之前张贴。

1
 if my_string is '': print ('My string is EMPTY') # **footnote

我想这就是原版海报想要表达的…读起来尽可能接近英语,并遵循坚实的编程实践。

1
2
3
4
if my_string is '':
    print('My string is EMPTY')
else:
    print(f'My string is {my_string}')

我认为这是一个很好的解决方案。

我注意到None已经进入了讨论,所以我们添加并进一步压缩:

1
2
3
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}')


或者以下

1
foo is ''

甚至

1
2
empty = ''
foo is empty


1
2
3
4
a = ''
b = '   '
a.isspace() -> False
b.isspace() -> True


当字符串为空时,if stringname:给出一个false。我想没有比这更简单的了。


I find hardcoding(sic)"" every time for checking an empty string not as good.

干净代码的方法

这样做:foo ==""是非常糟糕的实践。""是一个神奇的值。永远不要检查魔法值(通常称为魔法数字)

您应该做的是比较描述性变量名。

描述性的变量名

有人可能认为"empty_string"是一个描述性变量名。它不是。

在您执行empty_string =""并认为您有一个很好的变量名可以比较之前。这不是"描述性变量名"的意思。

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

它来自哪里。为什么在那里。你为什么要检查它。简单表单字段示例

您正在构建一个表单,用户可以在其中输入值。您想要检查用户是否写了什么。

一个好的变量名可以是not_filled_in

这使得代码非常易读

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

完整的CSV解析示例

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

(因为CSV完全基于文本,所以如果不使用预定义的关键字,它就不能表示None)

一个好的变量名可以是CSV_NONE

如果您有一个表示None的新CSV文件,其中使用的字符串不是"",那么这将使代码易于更改和调整

1
2
if csvfield == CSV_NONE:
    csvfield = None

这段代码是否正确是没有问题的。很明显,它做了它应该做的。

比较这

1
2
if csvfield == EMPTY_STRING:
    csvfield = None

第一个问题是,为什么空字符串需要特殊处理?

这将告诉未来的程序员,空字符串应该始终被认为是None

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

这两者之间需要有一个分离的关注点。


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

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


应对@1290。对不起,无法格式化注释中的块。None值在Python中不是空字符串,也不是(空格)。安德鲁·克拉克给出的答案是正确的:if not myString。@卢布给出的答案是特定于应用程序的,不回答OP的问题。如果您对"空白"字符串采用特殊的定义,就会遇到麻烦。特别是,标准行为是str(None)生成'None',一个非空字符串。

但是,如果您必须将None和(空格)视为"空白"字符串,这里有一个更好的方法:

1
2
3
4
5
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())

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
>>> 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

满足@卢布要求,同时不破坏字符串的预期bool行为。


1
not str(myString)

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


如果这对某些人有用,下面是我构建的一个快速函数,它用列表中的N/ a替换空字符串(python2)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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数据库非常有用,因为mysql数据库不接受某些字段的空白(模式中标记为NN的字段)。在我的例子中,这是由于复合主键造成的)。


当您按行读取文件,并想确定哪一行是空的,请确保您将使用.strip(),因为在"空"行中有新的行字符:

1
2
3
4
5
6
7
lines = open("my_file.log","r").readlines()

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

    # your code for non-empty lines

您可能会看到在Python中为空值或字符串赋值

这是关于比较空字符串的。因此,您可以使用not测试字符串是否为空,而不是使用""测试字符串是否为空……


1
2
3
4
5
str =""
if not str:
   print"Empty String"
if(len(str)==0):
   print"Empty String"


如果你只是使用

1
not var1

不可能将布尔型False变量与空字符串''区别开来:

1
2
3
4
5
6
7
var1 = ''
not var1
> True

var1 = False
not var1
> True

但是,如果您在脚本中添加一个简单的条件,就会产生不同:

1
2
3
4
5
6
7
var1  = False
not var1 and var1 != ''
> True

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

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

1
2
3
4
5
6
def empty(mystring):
    assert isinstance(mystring, str)
    if len(mystring) == 0:
        return True
    else:
        return False


对于那些期望apache StringUtils这样的行为的人。或番石榴串。isNullOrEmpty:

1
2
3
4
if mystring and mystring.strip():
    print"not blank string"
else:
    print"blank string"

就像上面prmatta贴的那样,但是有错误。

1
2
3
4
5
6
7
def isNoneOrEmptyOrBlankString (myString):
    if myString:
        if not myString.strip():
            return True
        else:
            return False
    return False


根据我的经验,对""的测试并不总是有效。这个简单的测试对我来说总是有效的:

1
if MyString == 'None'

1
if MyString != 'None'

阅读Excel电子表格时,我想停止使用以下while循环的列空:

1
while str(MyString) != 'None':