最优雅的方法来检查在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: 

只是为了澄清,如果序列在空或不空时,则在布尔上下文中评估FalseTrue 。 他们不等于 FalseTrue

最优雅的方法可能是简单地检查它的真实性或谬误,例如:

 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':