Most elegant way to check if the string is empty in Python?
Python是否有类似于空字符串变量的东西,你可以这样做:
1 | if myString == string.empty: |
无论如何,检查空字符串值的最佳方法是什么?我发现每次检查空字符串时硬编码
空字符串是"falsy",这意味着它们在布尔上下文中被认为是假的,所以你可以这样做:
1 | if not myString: |
如果您知道您的变量是一个字符串,那么这是首选的方法。如果变量也可以是其他类型,那么应该使用
来自PEP 8的"编程建议"部分:
For sequences, (strings, lists, tuples), use the fact that empty sequences are false.
所以你应该用:
1 | if not some_string: |
或者:
1 | if some_string: |
为了澄清这一点,如果序列为空或不为空,则在布尔上下文中将序列计算为
最优雅的方法可能就是简单地查一下它是真的还是假的。
1 | if not my_string: |
但是,您可能想去掉空白,因为:
1 2 3 4 5 6 | >>> bool("") False >>> bool(" ") True >>> bool(" ".strip()) False |
但是,您可能应该在这方面更加明确一些,除非您确定这个字符串已经通过某种验证,并且是一个可以通过这种方式测试的字符串。
在剥皮前我要测试一下是否为零。此外,我将使用空字符串为False(或Falsy)的事实。这种方法类似于Apache的StringUtils。isBlank或Guava's Strings.isNullOrEmpty
这是我用来测试一个字符串是空的还是空的:
1 2 3 4 5 6 | 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 |
并且,与测试字符串是否为空或非空正好相反:
1 2 3 4 5 6 | 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 |
以上代码的更简洁形式:
1 2 3 4 5 | def isBlank (myString): return not (myString and myString.strip()) def isNotBlank (myString): return bool(myString and myString.strip()) |
我曾经写过类似Bartek的答案和javascript的灵感:
1 2 | def is_not_blank(s): return bool(s and s.strip()) |
测试:
1 2 3 4 | print is_not_blank("") # False print is_not_blank(" ") # False print is_not_blank("ok") # True print is_not_blank(None) # False |
测试空字符串或空白字符串(较短的方法):
1 2 3 4 | if myString.strip(): print("it's not an empty or blank string") else: print("it's an empty or blank string") |
如果您想区分空字符串和空字符串,我建议使用
1 | if my_string is '': |
我没有在任何一个答案中注意到这种特殊的组合。我寻找
1 | is '' |
在答案之前张贴。
1 | if my_string is '': print ('My string is EMPTY') # **footnote |
我想这就是原版海报想要表达的…读起来尽可能接近英语,并遵循坚实的编程实践。
1 2 3 4 | if my_string is '': print('My string is EMPTY') else: print(f'My string is {my_string}') |
我认为这是一个很好的解决方案。
我注意到
1 2 3 | if my_string is '': print('My string is Empty') elif my_string is None : print('My string.... isn\'t') else: print(f'My string is {my_string}') |
或者以下
1 | foo is '' |
甚至
1 2 | empty = '' foo is empty |
1 2 3 4 | a = '' b = ' ' a.isspace() -> False b.isspace() -> True |
当字符串为空时,
I find hardcoding(sic)"" every time for checking an empty string not as good.
干净代码的方法
这样做:
您应该做的是比较描述性变量名。
描述性的变量名
有人可能认为"empty_string"是一个描述性变量名。它不是。
在您执行
一个好的描述性变量名是基于它的上下文的。你必须考虑空字符串是什么。
它来自哪里。为什么在那里。你为什么要检查它。简单表单字段示例您正在构建一个表单,用户可以在其中输入值。您想要检查用户是否写了什么。
一个好的变量名可以是
这使得代码非常易读
1 2 | if formfields.name == not_filled_in: raise ValueError("We need your name") |
完整的CSV解析示例
您正在解析CSV文件,希望将空字符串解析为
(因为CSV完全基于文本,所以如果不使用预定义的关键字,它就不能表示
一个好的变量名可以是
如果您有一个表示
1 2 | if csvfield == CSV_NONE: csvfield = None |
这段代码是否正确是没有问题的。很明显,它做了它应该做的。
比较这
1 2 | if csvfield == EMPTY_STRING: csvfield = None |
第一个问题是,为什么空字符串需要特殊处理?
这将告诉未来的程序员,空字符串应该始终被认为是
这是因为它混合了业务逻辑(CSV值应该是什么
这两者之间需要有一个分离的关注点。
这个怎么样?也许它不是"最优雅的",但它看起来相当完整和清晰:
1 | if (s is None) or (str(s).strip()==""): // STRING s IS"EMPTY"... |
应对@1290。对不起,无法格式化注释中的块。
但是,如果您必须将
1 2 3 4 5 | 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()) |
例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | >>> 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 |
满足@卢布要求,同时不破坏字符串的预期
1 | not str(myString) |
对于空字符串,此表达式为真。非空字符串、None和非字符串对象都将产生False,但需要注意的是,对象可能会覆盖_str__,通过返回一个假值来阻止这个逻辑。
如果这对某些人有用,下面是我构建的一个快速函数,它用列表中的N/ a替换空字符串(python2)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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 |
这对于将列表列表发布到mysql数据库非常有用,因为mysql数据库不接受某些字段的空白(模式中标记为NN的字段)。在我的例子中,这是由于复合主键造成的)。
当您按行读取文件,并想确定哪一行是空的,请确保您将使用
1 2 3 4 5 6 7 | lines = open("my_file.log","r").readlines() for line in lines: if not line.strip(): continue # your code for non-empty lines |
您可能会看到在Python中为空值或字符串赋值
这是关于比较空字符串的。因此,您可以使用
1 2 3 4 5 | str ="" if not str: print"Empty String" if(len(str)==0): print"Empty String" |
如果你只是使用
1 | not var1 |
不可能将布尔型
1 2 3 4 5 6 7 | var1 = '' not var1 > True var1 = False not var1 > True |
但是,如果您在脚本中添加一个简单的条件,就会产生不同:
1 2 3 4 5 6 7 | var1 = False not var1 and var1 != '' > True var1 = '' not var1 and var1 != '' > False |
我发现这很优雅,因为它确保它是一个字符串,并检查它的长度:
1 2 3 4 5 6 | def empty(mystring): assert isinstance(mystring, str) if len(mystring) == 0: return True else: return False |
对于那些期望apache StringUtils这样的行为的人。或番石榴串。isNullOrEmpty:
1 2 3 4 | if mystring and mystring.strip(): print"not blank string" else: print"blank string" |
就像上面prmatta贴的那样,但是有错误。
1 2 3 4 5 6 7 | def isNoneOrEmptyOrBlankString (myString): if myString: if not myString.strip(): return True else: return False return False |
根据我的经验,对
1 | if MyString == 'None' |
或
1 | if MyString != 'None' |
阅读Excel电子表格时,我想停止使用以下while循环的列空:
1 | while str(MyString) != 'None': |