如果for循环中的所有元素都没有数据,则添加条件

时间:2018-07-18 19:59:08

标签: python

我有一个for循环,该循环读取目录内容并检索.log文件。

for logs in glob.glob('*.log'):
    # do something

但是有时该文件夹没有日志文件,因此什么也没有发生。我可以添加一个if语句来检查for循环的每个循环,如果logs的值不是None,尽管感觉这不是正确的方法Python。

是否有更有效的方法与Python方法更接近?目的是要有一个条件,如果循环的任何一个周期都未返回任何日志文件,那么我应该通过打印或触发某些其他功能来处理有意义的消息。谢谢。

2 个答案:

答案 0 :(得分:2)

files_to_process =glob.glob('*.log')
if not files_to_process:
    # call a funtion

答案 1 :(得分:0)

您在这里似乎有一个误解:

  

但是有时该文件夹没有日志文件,因此什么也没有发生。如果logs的值不是None

,我可以添加一条if语句来检查for循环的每个周期。

那什么也做不了。如果没有日志,则glob将返回一个空列表,并且将不会使用logs=None来运行您的循环,它将根本不会运行您的循环:

>>> files = []
>>> for file in files:
...     if file is None:
...         print('None')
...     else:
...         print(file)

这将完全不打印任何内容。

如果要测试是否有任何结果,最简单的操作就是测试结果:

files = glob.glob('*.log')
for file in files:
    # do something
if not files:
    print('No files')

这不是一个完全通用的解决方案,如果要循环的可迭代对象可能是迭代器,而不是序列或其他容器。当且仅当序列为非空时,序列才是真实的,但是迭代器始终是真实的。另外,除了迭代之外,没有其他方法可以检查迭代器是否为空。因此,即使与迭代器一起使用的通用解决方案也需要某种标记或计数器。

有时候这样的hacky解决方案就足够可读了:

file = None
for file in glob.glob('*.log'):
    # do something
if file is not None:
    print('Empty')

…但是我认为在很多情况下(循环不是那么简单,以至于您可以立即将上面的file = None连接到测试之后,或者不能使用None因为它是Iterable的有效值,等等),所以最好不要露骨。

或者,如果您知道要获取序列,就像使用glob一样,只需进行上述简单的if not seq:测试即可。