ChatGPT解决这个技术问题 Extra ChatGPT

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

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

if myString == string.empty:

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

"" 怎么没那么好?
没有一个不会匹配“”。所以取决于你想要什么的上下文。

M
Mateen Ulhaq

空字符串是“假的”(python 2python 3 引用),这意味着它们在布尔上下文中被认为是假的,因此您可以这样做:

if not myString:

如果您知道您的变量是一个字符串,这是首选方式。如果您的变量也可以是其他类型,那么您应该使用:

if myString == "":

有关在布尔上下文中为 false 的其他值,请参阅 Truth Value Testing 上的文档。


小心,因为很多其他的东西也是假的。
我以前从未听说过 falsy 这个词。这是否意味着它返回false?
@Joan:它在布尔上下文中评估为 false。
OP 想知道变量是否为空字符串,但如果 myStringNone0False 等,您也将输入 if not myString: 块。所以如果您不确定什么类型 { 2} 是,您应该使用 if myString == "": 来确定它是否是一个空字符串,而不是其他一些虚假值。
@AndrewClark,对于这种情况,我们可以使用 if myString in (None, '') 或每个 @Bartek,而不是 if myString == ... 表达式链,if myString in (None, '') or not myString.strip()
z
zenpoy

PEP 8,在 “Programming Recommendations” section

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

所以你应该使用:

if not some_string:

或者:

if some_string:

澄清一下,如果序列是否为空,则在布尔上下文中评估FalseTrue。它们不等于 FalseTrue


PS:在 PEP 的辩护中,有人可能会争辩说“x is false”(小写 false)已经意味着,而不是意味着 x == False。但是恕我直言,鉴于目标受众,仍然欢迎澄清。
if not myString 在 python 3.8 中将此 var='' 捕获为空
A
Afriza N. Arief

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

if not my_string:

但是,您可能希望去除空白,因为:

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

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


r
rouble

我会在剥离之前测试虚无。此外,我会使用空字符串为 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

而且,与测试字符串是否不是 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

上述代码的更简洁形式:

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

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

为什么不if mystring and not mystring.strip()
它与 string and not string.isspace() 有何不同?
对于那些关心这些事情的人来说更简洁:def isBlank(s): return not (s and s.strip())def isNotBlank(s): return s and s.strip()
s.strip() 分配一个新字符串,这纯粹是浪费。使用string.isspace()
这个答案不是很pythonic
v
vault

我曾经写过类似于 Bartek 的回答和 javascript 启发的东西:

def is_not_blank(s):
    return bool(s and not s.isspace())

测试:

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())
AttributeError: 'NoneType' object has no attribute 'strip'
s.strip() 分配一个新字符串,这纯粹是浪费。使用string.isspace()
"".isspace()False
@Danon 不会通过第一次测试 s and 并且会短路。
D
Dakkaron

唯一真正可靠的方法是:

if "".__eq__(myString):

所有其他解决方案都有可能的问题和检查可能失败的边缘情况。

如果 myString 是从 str 继承并覆盖 __len__() 方法的类的对象,则 len(myString)==0 可能会失败。

同样,如果 myString 覆盖 __eq__()__ne__()myString == ""myString.__eq__("") 可能会失败。

出于某种原因,如果 myString 覆盖 __eq__()"" == myString 也会被愚弄。

myString is """" is myString 是等价的。如果 myString 实际上不是字符串而是字符串的子类,它们都将失败(两者都将返回 False)。此外,由于它们是身份检查,它们工作的唯一原因是因为 Python 使用字符串池(也称为 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 比较字符串是一个非常邪恶的陷阱,因为它有时会正常工作,但有时不会,因为字符串池遵循非常奇怪的规则。

也就是说,在大多数情况下,所有提到的解决方案都可以正常工作。这是帖子主要是学术工作。


@simpleuser 你当然是对的。在现实世界中,使用字符串的虚假性或将其与空字符串进行比较是完全可以的。这里的答案是故意的。
h
hostingutilities.com

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

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

如果是 myString = None,它将引发异常。更好地使用 @vault 的 answer
@Dominik if myString isinstance(myString, int) 也会引发异常。你想说啥? OP 要求测试空字符串的方法,他的问题不包括类型检查。
S
Silas Ray

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


我不知道你为什么要避免使用“”,除非它以某种方式影响性能,但我更喜欢你的答案而不是有无数赞成票的答案,因为它不那么令人困惑。但是,我想指出空列表显然也是 False。
f
fedorqui

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


C
Community

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

干净的代码方法

这样做: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

如果您有一个表示 None 的新 CSV 文件使用除 "" 之外的另一个字符串,这将使代码易于更改和调整

if csvfield == CSV_NONE:
    csvfield = None

这段代码是否正确是毫无疑问的。很明显,它做了它应该做的事情。

将此与

if csvfield == EMPTY_STRING:
    csvfield = None

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

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

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

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


真的需要费那么大的劲来避免“”吗?在比较的上下文中,空白字符串还有什么含义?
你说“not_filled_in”比“empty_string”更具描述性?我说你很高。
我不同意这个答案。幻数不好,这是有道理的。魔法值一般也是如此。但 "" 不是魔法值,与 TrueFalseNone 一样不是魔法值。
@firelynx 说“这个字符串是空的”比使用 "" 更明确多少?您还会将 True 重新定义为 REALLY_TRUE 吗?最后你会得到很多变量(与文字 "" 相比是非常量的),它们说同样的事情。那么,CSV_NONE 与 JSON_EMPTY_VALUE 有什么不同?当您在程序的不同部分之间传输时,就会出现问题。然后您可能不再知道您是有 None 还是 "",尤其是如果您将常量命名为 CSV_NONE 之类的误导性名称,它实际上不是 None 而是 ""
@firelynx 这会导致更多的歧义,而不仅仅是使用常量值 NoneTrueFalse""。每当您在名称中编码的信息多于值本身已有的信息时,使用变量而不是魔术值很有用,例如使用 STATE_A 而不是 27。或者只要有歧义,例如 GPIO.HIGH 而不是 1,因为根据您使用的逻辑,1 可能是 HIGHLOW。但是在给定的示例中,使用变量弊大于利。
B
BuvinJ

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

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

大多数情况下,包含空格的字符串不是“空的”。
我假设你的意思是空白?你指的是我对 strip() 的使用?对于大多数用途来说,它是空的!复合 s.trim().isEmpty() 之类的东西是非常常见的
嘿@Chris Johnson,您是否看到这里的大多数答案也使用 strip() ?你投了我们所有人的票,还是只有我?
A
Asherah
a = ''
b = '   '
a.isspace() -> False
b.isspace() -> True

真的不明白这个解决方案有什么好处。问题是关于测试字符串是否为空。如果您设置 a='a',您将获得 a.isspace() -> False,但该帐户上的 a 不会是空字符串。
C
Chris Johnson

回复@1290。抱歉,无法在评论中格式化块。 None 值在 Python 中不是空字符串,(空格)也不是。 Andrew Clark 的答案是正确的: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 行为。


python -c "if (str(None) == 'None'): print ('OMG, WHY ??')"
T
Tom Stambaugh

我对 ''、''、'\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()

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


F
Fax
not str(myString)

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


P
Pavel Štěrba

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

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

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

    # your code for non-empty lines

C
Community

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

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


k
kommradHomer

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

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

j
jberrio

如果你只是使用

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

R
Rene

如果您不能完全确定您的输入是否真的是一个字符串,我建议您另外使用 isinstance(object, classinfo) link,如示例中所示。

如果不是,列表或 True 布尔值也可以评估为 True

def test_string(my_string): if isinstance(my_string, str) and my_string: print("It's a me, String! -> " + my_string) else: print("Nope. No, String") def not_fully_test_string(my_string): if my_string: print("It's a me, String??? -> " + str(my_string)) else: print("Nope. No, String") print("Testing String: ") test_string("") test_string(True) test_string(["string1", "string2"]) test_string("My String") test_string(" ") print("\nTesting String or not?") not_fully_test_string("" ) not_fully_test_string(True) not_fully_test_string(["string1", "string2"]) not_fully_test_string("My String") not_fully_test_string(" ")


M
Mateen Ulhaq

最明确的方法是:

if s == "":

好处:

对程序员的附加指示 s 应该是什么类型。

"" 不是“硬编码”一个魔法值,就像 x == 0 一样。有些值是基本的,不需要命名常量;例如 x % 2 检查偶数。

不能错误地指出任何虚假值(例如 [])是空字符串。

考虑如何检查一个整数是否为 0:

if x == 0:

一个当然不应该这样做:

if not x:

整数和字符串都是原始值类型。为什么要区别对待?


w
wij

如果你想检查一个字符串是否完全为空

if not mystring

这是有效的,因为空字符串是错误的,但如果一个字符串只是空格,它将是真的,所以你可能想要

if not mystring.strip()

其他答案不是已经涵盖了吗?
F
FlyingZebra1

如果这对某人有用,这是我构建的一个快速函数,用于在列表列表(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 数据库中很有用。


M
Mateen Ulhaq

以下是适用于任意数量空间的优雅解决方案。

def str_empty(s: str) -> bool:
    """Strip white space and count remaining characters."""
    return len(s.strip()) < 1


>>> str_empty(' ')
True

.strip() 与问题没有直接关系。此外,为像 s == "" 这样简单的东西创建一个 str_empty 函数也太过分了。此外,len(s) == 0 将是比 len(s) < 1 更好的表达式。
根据偏好,这些都不会阻止解决方案发挥作用。同时,您首选的解决方案不起作用,因为 s == ""s == " " 不等价,但在大多数情况下它们都可以被视为空。
如果目标是处理空格,则在检查结果字符串是否为空之前使用 .strip()any 解决方案有效。 s.strip() == ""; not s.strip(); len(s.strip()) == 0; ...但是,空格并不是这个问题的真正重点,所以我发现这么多答案都在谈论它是不寻常的。
这是因为“空”通常被解释为真正的空或由空格组成。因此,对两者都适用的解决方案似乎是合适的。
S
Shadow

正如 prmatta 上面发布的,但有错误。

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

刚刚测试:他的代码为 """ " 返回 True,为 "a" 返回 False(正如预期的那样)。您的代码返回相同,除了它返回 True 的空字符串,它不应该。
sry 太累了:您的代码为空字符串返回 False。
这段代码是错误的。如果字符串为空或无,则返回 False。