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

2024-12-27 08:47:00
admin
原创
118
摘要:问题描述:Python 是否有类似空字符串变量的东西,您可以在其中执行以下操作:if myString == string.empty: 无论如何,检查空字符串值的最优雅方法是什么?我发现""每次检查空字符串都进行硬编码并不是那么好。解决方案 1:空字符串是“假的”(python 2或py...

问题描述:

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

if myString == string.empty:

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


解决方案 1:

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

if not myString:

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

if myString == "":

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

解决方案 2:

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

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

因此你应该使用:

if not some_string:

或者:

if some_string:

需要澄清的是,在布尔上下文中,序列是否为空将被评估False或。它们等于或。True`False`True

解决方案 3:

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

if not my_string:

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

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

然而,您可能应该对此更加明确,除非您确切知道该字符串已通过某种验证并且可以用这种方式测试的字符串。

解决方案 4:

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

我将使用以下命令来测试字符串是否为None空或空白:

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

这与测试字符串是否为None空或空白完全相反:

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

解决方案 5:

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

解决方案 6:

唯一真正可靠的方法如下:

if "".__eq__(myString):

所有其他解决方案都可能存在问题以及检查可能失败的极端情况。

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

  • myString == ""如果覆盖和,则和myString.__eq__("")可能会失败。myString`__eq__()`__ne__()

  • "" == myString`myString如果覆盖,也会被欺骗__eq__()`。

  • myString is ""和是等价的。如果实际上不是字符串而是字符串的子类,"" is myString它们都会失败(两者都会返回)。此外,由于它们是身份检查,它们起作用的唯一原因是 Python 使用了字符串池(也称为字符串驻留),如果字符串被驻留,它会使用相同的字符串实例(请参阅此处:为什么使用“==”或“is”比较字符串有时会产生不同的结果?)。并且从一开始就在 CPython 中驻留myString`False`""

身份检查的最大问题是,就我所知,字符串驻留并没有标准化哪些字符串需要驻留。这意味着,理论上""没有必要驻留,这取决于具体实现。

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

  • 如果对象覆盖,则依赖字符串的虚假性可能不起作用__bool__()

唯一真正无法欺骗的方法是开头提到的方法:"".__eq__(myString)。由于这明确调用了__eq__()空字符串的方法,因此无法通过覆盖 myString 中的任何方法来欺骗它,并且可以与 的子类可靠地协同工作str

这不仅是理论工作,而且可能实际上与实际使用相关,因为我str之前看到过框架和库的子类化和使用myString is ""可能会在那里返回错误的输出。

尽管如此,在大多数情况下,所有提到的解决方案都能正常工作。这篇文章主要是学术工作。

解决方案 7:

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

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

解决方案 8:

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

解决方案 9:

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

解决方案 10:

我发现每次都使用硬编码“”来检查空字符串并不是很好。

清洁代码方法

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

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

描述性变量名称

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

两者之间需要有关注点分离。

解决方案 11:

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

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

解决方案 12:

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

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

解决方案 13:

回复@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字符串的预期行为。

解决方案 14:

最明确的方法是:

if s == "":

好处:

  • 向程序员提供额外的指示,指示类型s应该是什么。

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

  • 不能错误地表明任何假值(例如[])是空字符串。


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

if x == 0:

我们绝对应该这样做:

if not x:

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

解决方案 15:

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

解决方案 16:

not str(myString)

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

解决方案 17:

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

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

解决方案 18:

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

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

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

    # your code for non-empty lines

解决方案 19:

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

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

显示代码片段

<script type="text/javascript" src="//cdn.datacamp.com/dcl-react.js.gz"></script>

<div data-datacamp-exercise data-lang="python">
  <code data-type="sample-code">
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("
Testing 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(" ")

  </code>
</div>

Run code snippetHide resultsExpand snippet

解决方案 20:

您可以检查字符串是否完全为空,如下所示。 * strip()可以删除空格:

test1 = ""
test2 = "    "
test3 = "    ".strip()

print(bool(test1), bool(test2), bool(test3))
         # False      # True       # False

if test1:
    print("test1") # Not run
    
if test2:
    print("test2") # Run

if test3:
    print("test3") # Not run

if not test1:
    print("test1") # Run
    
if not test2:
    print("test2") # Not run

if not test3:
    print("test3") # Run
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1572  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1355  
  信创产品在政府采购中的占比分析随着信息技术的飞速发展以及国家对信息安全重视程度的不断提高,信创产业应运而生并迅速崛起。信创,即信息技术应用创新,旨在实现信息技术领域的自主可控,减少对国外技术的依赖,保障国家信息安全。政府采购作为推动信创产业发展的重要力量,其对信创产品的采购占比情况备受关注。这不仅关系到信创产业的发展前...
信创和国产化的区别   0  
  信创,即信息技术应用创新产业,旨在实现信息技术领域的自主可控,摆脱对国外技术的依赖。近年来,国货国用信创发展势头迅猛,在诸多领域取得了显著成果。这一发展趋势对科技创新产生了深远的推动作用,不仅提升了我国在信息技术领域的自主创新能力,还为经济社会的数字化转型提供了坚实支撑。信创推动核心技术突破信创产业的发展促使企业和科研...
信创工作   0  
  信创技术,即信息技术应用创新产业,旨在实现信息技术领域的自主可控与安全可靠。近年来,信创技术发展迅猛,对中小企业产生了深远的影响,带来了诸多不可忽视的价值。在数字化转型的浪潮中,中小企业面临着激烈的市场竞争和复杂多变的环境,信创技术的出现为它们提供了新的发展机遇和支撑。信创技术对中小企业的影响技术架构变革信创技术促使中...
信创国产化   0  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用