我有一个for循环,该循环读取目录内容并检索.log
文件。
for logs in glob.glob('*.log'):
# do something
但是有时该文件夹没有日志文件,因此什么也没有发生。我可以添加一个if
语句来检查for循环的每个循环,如果logs
的值不是None
,尽管感觉这不是正确的方法Python。
是否有更有效的方法与Python方法更接近?目的是要有一个条件,如果循环的任何一个周期都未返回任何日志文件,那么我应该通过打印或触发某些其他功能来处理有意义的消息。谢谢。
答案 0 :(得分:2)
files_to_process =glob.glob('*.log')
if not files_to_process:
# call a funtion
答案 1 :(得分:0)
您在这里似乎有一个误解:
但是有时该文件夹没有日志文件,因此什么也没有发生。如果
,我可以添加一条if语句来检查for循环的每个周期。logs
的值不是None
…
那什么也做不了。如果没有日志,则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:
测试即可。