如何在 Python 中检查字符串是否为空?
- 2024-12-27 08:47:00
- admin 原创
- 118
问题描述:
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