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

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

if myString == string.empty:

无论如何,检查空字符串值的最优雅方式是什么?我发现每次硬编码""来检查空字符串的效果并不理想。

解决办法

空字符串是"falsy",这意味着它们在布尔语境中被视为假的,所以你可以直接这样做。

if not myString:

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

评论(13)

来自PEP 8,在"编程建议 "部分

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

所以你应该使用。

if not some_string:

或。

if some_string:

澄清一下,在布尔语境中,如果序列是空的或者不是空的,那么序列就会被评价为False'或者True'。它们不等于**为 "False "或 "True"。

评论(2)

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

if not my_string:

然而,你可能想剥离白色空间,因为。

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

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

评论(0)

我会在剥离前测试非性。 另外,我会利用空字符串是False(或Falsy)这一事实。 这种方法类似于[Apache's StringUtils.isBlank][1]或[Guava's Strings.isNullOrEmpty][2]。

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

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())

[1]: https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html#isBlank-java.lang.CharSequence- [2]: https://google.github.io/guava/releases/19.0/api/docs/com/google/common/base/Strings.html#isNullOrEmpty(java.lang.String)

评论(3)

我曾经写过类似于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
评论(0)

真正靠谱的方法只有以下几种。

if "".__eq__(myString):

所有其他的解决方案都有可能出现问题,并且在边缘情况下检查可能失败。

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

类似的myString == ""myString.__eq__("")如果myString覆盖了__eq__()__ne__(),则myString.__eq__()会失败。

由于某些原因"" == 如果myString覆盖了eq()myString`也会被愚弄。

myString is """" is myString是等价的。 如果myString实际上不是一个字符串,而是字符串的子类,它们都会失败(都会返回False)。 另外,由于它们是身份检查,它们工作的唯一原因是Python使用了String Pooling(也叫String Internment),如果一个字符串被实习,它就会使用同一个实例(见这里。 https://stackoverflow.com/questions/1504717/why-does-comparing-strings-using-either-or-is-sometimes-produce-a-differe)。) 而在CPython中,""从一开始就被实习了。

身份检查的最大问题是String Internment的问题(据我所知),它并没有标准化哪些字符串被实习。 也就是说,理论上""是没有必要被实习的,这取决于实现。

真正不能被忽悠的只有开头提到的那个方法。 "".__eq__(myString)。 由于这个显式调用了空字符串的__eq__()方法,所以不能通过覆盖myString中的任何方法来忽悠,而是扎扎实实地用str的子类来工作。

另外,如果对象覆盖了它的__bool__()方法,那么依靠字符串的虚假性可能就不行了。

这不仅是理论上的工作,而且在实际使用中可能会有关系,因为我以前见过框架和库子化str,使用myString is ""可能会在那里返回一个错误的输出。

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

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

评论(2)

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

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

如果你想区分空字符串和空字符串,我建议使用if len(string),否则,我'会建议像其他人说的那样简单地使用if string。 不过关于字符串充满空格的注意事项仍然适用,所以不要忘记strip

评论(1)

if stringname:当字符串为空时,会给出一个false。 我想不能再简单了吧'。

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

我发现硬编码(原文如此)"&quot。 每次检查一个空字符串的时候,都没有那么好。

清洁代码的方法

这样做。 foo == ""是非常不好的做法。 ""是一个神奇的值。 你永远不应该对魔法值进行检查(更常见的是[魔法数字][1])。

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

描述性变量名

人们可能会认为,"empty_string&quot。 是一个描述性的变量名称。 它不是

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

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

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

简单的表格字段示例

你正在建立一个用户可以输入值的表单。 你想检查用户是否写了一些东西,一个好的变量名称可能是not_filled_in

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

这使得代码非常可读

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

彻底的CSV解析示例。

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

(由于CSV完全是基于文本的,所以如果不使用预定义的关键字,就无法表示 "无")

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

如果您有一个新的CSV文件,用另一个比"""`更多的字符串表示 "None",这使得代码很容易改变和适应。

if csvfield == CSV_NONE:
    csvfield = None

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

将此与

if csvfield == EMPTY_STRING:
    csvfield = None

这里的第一个问题是,为什么空字符串值得特殊对待?

这将告诉未来的编码者,空字符串应该总是被认为是None

这是因为它混淆了业务逻辑(什么CSV值应该是None)和代码实现(我们到底要比较什么)。

两者之间需要有一个[分离关注][2]。

[1]: https://en.wikipedia.org/wiki/Magic_number_(编程) [2]: https://en.wikipedia.org/wiki/Separation_of_concerns

评论(9)

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

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

回应@1290。 对不起,没有办法在注释中格式化块。 None值在Python中不是空字符串,(空格)也不是。 安德鲁-克拉克的答案才是正确的。 if not myString. 来自@rouble的答案是针对具体应用的,并没有回答OP'的问题。 如果你对什么是"空白&quot.字符串采用一个奇特的定义,你就会遇到麻烦。 字符串的定义,就会有麻烦。 特别是,标准行为是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())

例子: {{{12536373}}

>>> 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行为。

评论(0)

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

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

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

def isStringEmpty(inputString):
    if len(inputString) == 0:
        return True
    else:
        return False
评论(1)
str = ""
if not str:
   print "Empty String"
if(len(str)==0):
   print "Empty String"
评论(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
评论(0)

如果这对某人有用,这里是我建立的一个快速函数,用于在 list of list (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的字段。 在我的例子中,这是由于一个复合主键)。)

评论(0)

对于那些期待像apache [StringUtils.isBlank][1] 或Guava [Strings.isNullOrEmpty][2] 这样的行为的人来说。

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

[1]: http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html#isBlank(java.lang.CharSequence) [2]: http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/base/Strings.html#isNullOrEmpty(java.lang.String)

评论(0)

当你在逐行读取文件时,想确定哪一行是空的,请确保你会使用.strip(),因为在"empty&quot中有新的行字符。 行中有新的行字符。

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

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

    # your code for non-empty lines
评论(0)