功能在空序列上失败

2024-06-28 20:06:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在一个目录中找到最新文件的日期,基于我在这个网站上不知羞耻地找到的一些Python代码。在

def newest_file_in_tree(rootfnewer, extension=".avi"):
    return max(
        (os.path.join(dirname, filename)
        for dirname, dirnames, filenames in os.walk(rootfnewer)
        for filename in filenames
        if filename.endswith(extension)),
        key=lambda fn: os.stat(fn).st_mtime)

这是可行的,但在空目录下失败。在

^{pr2}$

我承认我是Python初学者,最后一行远远超出了我的工资等级。在

有人能建议我如何捕捉错误并防止函数崩溃吗?在


Tags: 文件代码in目录foros网站def
2条回答

您可以将这个可怕的python一行代码分成两行,以确保只有当您有一个非空的文件列表,从中选择最新的文件时,max才被调用:

def newest_file_in_tree(rootfnewer, extension=".avi"):
    files = [
        os.path.join(dirname, filename)
        for dirname, dirnames, filenames in os.walk(rootfnewer)
        for filename in filenames
        if filename.endswith(extension)
    ]

    if files:
        return max(files, key=lambda fn: os.stat(fn).st_mtime)

    return None

虽然没有@hiroprotopictor的解决方案那么漂亮,但更具可读性。在

^{}有一个default关键字:

m = max([], key=lambda x: abs(x), default='empty...')
print(m) # 'empty...'

如果iterable为空,则返回default。如果没有default,这将引发一个ValueError。在


另一种方法是使用^{}列出文件:

^{pr2}$

或者用^{}更简洁:

from pathlib import Path

def newest_file_in_tree(rootpath, ext='.avi'):
    return max(Path(rootpath).glob('**/*{}'.format(ext)),
               key=lambda pth: pth.stat().st_mtime, default='?')

相关问题 更多 >