最优雅的方法来检查在Python中的string是否为空?
Python有什么东西像一个空的stringvariables,你可以做什么?
if myString == string.empty:
无论检查空string值的最优雅的方法是什么? 我发现硬编码""
每次检查一个空string都不好。
空string是“虚假的” ,这意味着它们在布尔上下文中被认为是错误的,所以你可以这样做:
if not myString:
如果你知道你的variables是一个string,这是首选的方法。 如果你的variables也可以是其他types,那么你应该使用myString == ""
。 有关在布尔上下文中为false的其他值,请参阅“ 真值testing”的文档。
从PEP 8 ,在“编程build议”部分 :
对于序列(string,列表,元组),使用空序列为假的事实。
所以你应该使用:
if not some_string:
要么:
if some_string:
只是为了澄清,如果序列在空或不空时,则在布尔上下文中评估为False
或True
。 他们不等于 False
或True
。
最优雅的方法可能是简单地检查它的真实性或谬误,例如:
if not my_string:
但是,您可能需要去掉空白区域,因为:
>>> bool("") False >>> bool(" ") True >>> bool(" ".strip()) False
但是,您应该更清楚一点,除非您确定该string已通过某种validation,并且是可以用这种方式进行testing的string。
我会在剥离之前testing一下没有。 另外,我会使用空string为False(或Falsy)的事实。 这种方法类似于Apache的StringUtils.isBlank或Guava's Strings.isNullOrEmpty
这是我将用来testing一个string是否为空或空或空白:
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
而且,与testingstring是否不相同的情况完全相反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
上述代码更简洁的forms:
def isBlank (myString): return not (myString and myString.strip()) def isNotBlank (myString): return bool(myString and myString.strip())
我曾经写过类似于Bartek的答案和javascript的启发:
def isNotEmpty(s): return bool(s and s.strip())
testing:
print isNotEmpty("") # False print isNotEmpty(" ") # False print isNotEmpty("ok") # True print isNotEmpty(None) # False
如果你想区分空string和空string,我会build议使用, if len(string)
,否则,我会build议使用简单的if string
如别人所说的。 关于string充满空白的警告仍然适用,所以不要忘记strip
。
testing空白或空白string(更短的方式):
if myString.strip(): print("it's not an empty or blank string") else: print("it's an empty or blank string")
a = '' b = ' ' a.isspace() -> False b.isspace() -> True
我发现硬编码(sic)“”每次检查一个空string都不好。
清洁的代码方法
这样做: foo == ""
是非常糟糕的做法。 ""
是一个神奇的价值。 你不应该检查神奇的价值(通常被称为神奇的数字 )
你应该做的是比较描述性的variables名称。
描述性variables名称
有人可能会认为“empty_string”是一个描述性的variables名称。 事实并非如此 。
在你去之前做empty_string = ""
并认为你有一个很好的variables名来比较。 这不是“描述性variables名”的意思。
一个好的描述性variables名是基于其上下文的。 你必须考虑空string是什么。
- 它从何而来。
- 为什么在那里。
- 为什么你需要检查它。
简单的表单字段示例
您正在构build一个用户可以input值的表单。 你想检查用户是否写了一些东西。
一个好的variables名可能是not_filled_in
这使代码非常可读
if formfields.name == not_filled_in: raise ValueError("We need your name")
彻底的CSVparsing示例
您正在parsingCSV文件,并希望将空stringparsing为None
(由于CSV完全是基于文本的,因此不能使用预定义的关键字来表示None
)
一个好的variables名可能是CSV_NONE
这使代码易于更改和适应,如果你有一个新的CSV文件,代表None
与另一个string比""
if csvfield == CSV_NONE: csvfield = None
没有关于这段代码是否正确的问题。 它很清楚,它做它应该做的。
比较这个
if csvfield == EMPTY_STRING: csvfield = None
这里的第一个问题是,为什么空string应该得到特殊的处理?
这将告诉未来的编码器,一个空string总是应该被认为是None
。
这是因为它混合了业务逻辑(什么CSV值应该是None
)与代码实现(我们实际上比较什么)
两者之间需要分开关注 。
if stringname:
string为空时为false
。 我想这不可能比这更简单。
对于期望apache StringUtils.isBlank或Guava Strings.isNullOrEmpty行为的用户:
if mystring and mystring.strip(): print "not blank string" else: print "blank string"
回应@ 1290。 抱歉,无法在评论中格式化块。 None
值不是Python中的空string,也不是(空格)。 Andrew Clark的答案是正确的: if not myString
。 @ Trouble的答案是特定于应用程序的,并不回答OP的问题。 如果您对什么是“空白”string采取特殊的定义,您将遇到麻烦。 特别是,标准的行为是str(None)
产生'None'
,一个非空string。
但是,如果您必须将None
和(空格)视为“空白”string,以下是一个更好的方法:
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
在不中断string的预期bool
行为的情况下,达到@
你可能会看看这个在Python中分配空值或string
这是关于比较空的string。 所以,而不是testingnot
空虚,你可能会testing是你的string等于空string与""
空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
正如上面的prmatta,但错误。
def isNoneOrEmptyOrBlankString (myString): if myString: if not myString.strip(): return True else: return False return False
在我的经验testing""
并不总是工作。 这个简单的testing一直为我工作:
if MyString == 'None'
要么
if MyString != 'None'
读取Excel电子表格我想停止使用以下while循环时列变空:
while str(MyString) != 'None':