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

if myString == string.empty:

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


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

if not myString:

如果知道变量是字符串,这是首选方法。如果变量也可以是其他类型,则应使用:

if myString == "":

有关布尔上下文中为假的其他值,请参阅真值测试文档。


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

if not my_string:

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

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

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


PEP 8中“编程建议”部分:

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

因此,您应该使用:

if not some_string:

or:

if some_string:

为了澄清,如果序列为空或不为空,则在布尔上下文中将其求值为False或True。它们不等于False或True。


if-stringname:当字符串为空时,返回false。我想再简单不过了。


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


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

您可能会看到Python中的“分配空值或字符串”

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


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

这是我用来测试字符串是否为None或Empty或Blank的方法:

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

如果字符串不是None NOR Empty NOR Blank,则与测试正好相反:

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

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

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

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

对于那些期望类似apacheStringUtils.isBlank或Guava Strings.isNullOrEmpty的行为的人:

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

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

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

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

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

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

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

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

    # your code for non-empty lines

我发现每次检查空字符串的硬编码(sic)“”都不太好。

清洁代码方法

这样做:foo==“”是非常糟糕的做法。“”是一个神奇的值。你不应该检查魔法值(更常见的是魔法数字)

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

描述性变量名称

人们可能认为“empty_string”是一个描述性变量名称。它不是。

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

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

它从哪里来。为什么在那里。为什么你需要检查它。

简单表单字段示例

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

一个好的变量名可能是not_fill_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)和代码实现(我们实际比较的是什么)

这两者之间需要分开关注。


回复@1290。抱歉,无法格式化注释中的块。None值在Python中不是空字符串,也不是(空格)。安德鲁·克拉克的答案是正确的:如果不是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要求,同时不破坏字符串的预期布尔行为。


not str(myString)

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


如果你只是使用

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

如果这对某人有用,这里有一个我构建的快速函数,用于将列表列表中的空白字符串替换为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的字段。在我的例子中,这是由于一个复合主键)。


唯一真正可靠的方法是:

if "".__eq__(myString):

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

如果myString是继承自str并重写__len__()方法的类的对象,则len(myString)==0可能失败。myString==“”和myString__如果myString重写__eq__()和__ne__(),则eq__(“”)可能失败。“”==如果myString重写__eq__(),myString也会被愚弄。myString是“”,“”是myString。如果myString实际上不是字符串而是字符串的子类(两者都将返回False),则它们都将失败。此外,由于它们是身份检查,所以它们工作的唯一原因是因为Python使用字符串池(也称为字符串互存),如果字符串被互存,则使用相同的字符串实例(请参见此处:为什么使用“==”或“is”比较字符串有时会产生不同的结果?)。“”从一开始就在CPython实习身份检查的一个大问题是,字符串实习(据我所知)没有标准化哪些字符串被实习。这意味着,理论上“”不是必需的,这取决于实现。此外,使用字符串进行比较通常是一个非常邪恶的陷阱,因为它有时会正常工作,但有时不会,因为字符串池遵循非常奇怪的规则。如果对象重写__bool__(),则依赖字符串的虚假性可能不起作用。

唯一不能被愚弄的方法就是开头提到的“”__eq__(myString)。由于它显式调用空字符串的__eq__()方法,因此不能通过重写myString中的任何方法来欺骗它,并且可以与str的子类一起工作。

这不仅是理论上的工作,实际上可能与实际使用相关,因为我以前见过框架和库将str子类化,并且使用myString is“”可能会返回错误的输出。

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


我对“”、“”和“\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()

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


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

如果不是,列表或True布尔值也可以计算为True。

<script type=“text/javascript”src=“//cdn.datacamp.com/dcl react.js.gz”></script><div data datacamp练习数据lang=“python”><code data type=“样本代码”>定义测试字符串(my_string):如果isinstance(my_string,str)和my_string:print(“这是我,字符串!->”+my_String)其他:print(“不,不,字符串”)def not_fully_test_string(my_string):如果my_string:print(“这是我,String???->”+str(my_String))其他:print(“不,不,字符串”)print(“测试字符串:”)test_string(“”)test_string(真)测试字符串([“string1”,“string2”])test_string(“我的字符串”)test_string(“”)print(“\n是否测试字符串?”)not_fully_test_string(“”)not_fully_test_string(真)not_fully_test_string([“string1”,“string2”])not_fully_test_string(“我的字符串”)not_fully_test_string(“”)</code></div>


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

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


>>> str_empty(' ')
True

最清晰的方法是:

if s == "":

优点:

向编程器提供应为什么类型的附加指示。“”不是“硬编码”,它是一个神奇的值,比x==0更大。有些值是基本的,不需要命名常量;例如,x%2以检查偶数。不能错误地指示任何错误值(例如[])为空字符串。


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

if x == 0:

人们当然不应该这样做:

if not x:

整数和字符串都是基元值类型。为什么要区别对待他们?


如果要检查字符串是否完全为空

if not mystring

因为空字符串为false但如果字符串仅为空白,则为真,因此您可能希望

if not mystring.strip()