Python是否有类似空字符串变量的内容可以在其中执行:
if myString == string.empty:
无论如何,检查空字符串值的最优雅方法是什么? 我发现每次都很难对空字符串进行硬编码""
。
#1楼
a = ''
b = ' '
a.isspace() -> False
b.isspace() -> True
#2楼
您可能会看一下在Python中分配空值或字符串
这是关于比较是空字符串。 因此,您可以测试是否您的字符串等于带有""
的空字符串为空的字符串,而不是使用not
测试是否为空。
#3楼
我会在剥离之前测试无。 另外,我会使用一个空字符串为False(或Falsy)的事实。 这种方法类似于Apache的StringUtils.isBlank或番石榴的Strings.isNullOrEmpty
这就是我用来测试字符串是否为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空或NOR空白完全相反:
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())
#4楼
如prmatta上面所述,但有误。
def isNoneOrEmptyOrBlankString (myString):
if myString:
if not myString.strip():
return True
else:
return False
return False
#5楼
我曾经写过类似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
#6楼
对于那些期望像Apache StringUtils.isBlank或Guava Strings.isNullOrEmpty这样的行为的用户:
if mystring and mystring.strip():
print "not blank string"
else:
print "blank string"
#7楼
测试空字符串或空字符串(较短的方法):
if myString.strip():
print("it's not an empty or blank string")
else:
print("it's an empty or blank string")
#8楼
这个怎么样? 也许它不是“最优雅”的,但是看起来很完整和清晰:
if (s is None) or (str(s).strip()==""): // STRING s IS "EMPTY"...
#9楼
当您逐行读取文件并要确定哪一行为空时,请确保使用.strip()
,因为“空”行中包含换行符:
lines = open("my_file.log", "r").readlines()
for line in lines:
if not line.strip():
continue
# your code for non-empty lines
#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
如果您有一个新的CSV文件,该文件表示“ None
且字符串以外的其他字符串""
,则可以轻松更改和修改代码
if csvfield == CSV_NONE:
csvfield = None
毫无疑问,这段代码是否正确。 很明显,它做了应该做的事情。
比较一下
if csvfield == EMPTY_STRING:
csvfield = None
这里的第一个问题是,为什么空字符串应该得到特殊对待?
这将告诉以后的编码人员,应该始终将空字符串视为None
。
这是因为它将业务逻辑(CSV值应为None
)与代码实现(我们实际比较的是什么)混合在一起
两者之间需要分开关注 。
#11楼
响应@ 1290。 抱歉,无法格式化注释中的块。 None
值在Python中不是空字符串,也不是(空格)。 来自安德鲁·克拉克的答案是正确的答案: if not myString
。 @rouble的答案是特定于应用程序的,不能回答OP的问题。 如果您对“空白”字符串采用特殊定义,则会遇到麻烦。 特别地,标准行为是str(None)
生成'None'
,这是一个非空白字符串。
但是,如果必须将None
和(spaces)视为“空白”字符串,这是一种更好的方法:
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
行为。
#12楼
not str(myString)
对于空字符串,此表达式为True。 非空字符串,None和非字符串对象都将产生False,但需要注意的是,对象可以重写__str__以通过返回虚假值来阻止此逻辑。
#13楼
str = ""
if not str:
print "Empty String"
if(len(str)==0):
print "Empty String"
#14楼
如果你只是用
not var1
不能将变量boolean False
与空字符串''
区别开''
:
var1 = ''
not var1
> True
var1 = False
not var1
> True
但是,如果您在脚本中添加一个简单条件,则会有所不同:
var1 = False
not var1 and var1 != ''
> True
var1 = ''
not var1 and var1 != ''
> False
#15楼
我觉得这很优雅,因为它可以确保它是一个字符串并检查其长度:
def empty(mystring):
assert isinstance(mystring, str)
if len(mystring) == 0:
return True
else:
return False
#16楼
如果这对某人有用,这是我构建的一种快速功能,可以用列表列表中的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
这对于将列表列表发布到不接受某些字段空白(在模式中标记为NN的字段,在我的情况下,这是由于复合主键导致)的mysql数据库中很有用。
#17楼
另一个简单的方法可能是定义一个简单的函数:
def isStringEmpty(inputString):
if len(inputString) == 0:
return True
else:
return False
#18楼
唯一真正可靠的方法是:
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 Pooling(也称为String Internment),该字符串池在被插入时使用相同的字符串实例。 而""
从一开始就在CPython中被嵌入
身份检查的最大问题是,据我所知,String Internment不规范要插入哪些字符串。 这意味着,理论上""
不是必需的,而是依赖于实现的。
真正不能被愚弄的唯一方法是开头提到的方法: "".__eq__(myString)
。 由于此方法显式调用了空字符串的__eq__()
方法,因此不能通过覆盖myString中的任何方法来欺骗它,并且可以与str
子类牢固地配合使用。
如果对象覆盖了它的__bool__()
方法,那么也不能依靠字符串的虚假性来工作。
这不仅是理论上的工作,而且实际上可能与实际用法有关,因为我之前看到框架和库将str
子类化,并且使用myString is ""
可能会在那里返回错误的输出。
另外,比较使用字符串is
一般是一个非常邪恶的陷阱,因为它会正常工作有时,但不是在其他时间,因为字符串池下面很奇怪的规则。
也就是说,在大多数情况下,所有提到的解决方案都可以正常工作。 这是大多数学术工作。
#19楼
空字符串是“虚假的” ,这意味着它们在布尔上下文中被认为是错误的,因此您可以执行以下操作:
if not myString:
如果您知道变量是字符串,则这是首选方法。 如果您的变量也可以是其他类型,则应使用myString == ""
。 有关在布尔上下文中为假的其他值,请参见“ 真值测试 ”文档。
#20楼
最优雅的方法可能是简单地检查其真实性或虚假性,例如:
if not my_string:
但是,您可能要删除空格,因为:
>>> bool("")
False
>>> bool(" ")
True
>>> bool(" ".strip())
False
但是,您可能应该对此更加明确,除非您确定该字符串已通过某种验证并且可以通过这种方式进行测试。
#21楼
对于序列(字符串,列表,元组),请使用空序列为假的事实。
因此,您应该使用:
if not some_string:
要么:
if some_string:
为了明确起见,如果序列为空或不为空,则它们在布尔上下文中被评估为False
或True
。 它们不等于 False
或True
。
#22楼
if stringname:
字符串为空, if stringname:
false
。 我想这不可能比这更简单。
#23楼
如果要区分空字符串和空字符串,我建议使用if len(string)
,否则,我建议仅使用if string
就像其他人所说的那样。 关于充满空格的字符串的警告仍然适用,因此请不要忘记strip
。