Python 函数在空序列上失败

Python 函数在空序列上失败,python,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

我正试图在一个目录中找到最新文件的日期,这是基于我在这个网站上不知羞耻地找到的一些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)
这可以工作,但在空目录上失败

    key=lambda fn: os.stat(fn).st_mtime)
ValueError: max() arg is an empty sequence
我承认我是Python初学者,最后一行远远超出了我的工资等级


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

您可以将可怕的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
不像@hiroprotation的解决方案那么漂亮,但可读性更强。

有一个
默认值
关键字:

m = max([], key=lambda x: abs(x), default='empty...')
print(m) # 'empty...'
如果iterable为空,将返回默认值
。如果没有
默认值
,这将引发
值错误


您可以使用另一种方式列出文件:

import os
from glob import glob

def newest_file_in_tree(rootdir, ext='.avi'):
    glob_wildcard = os.path.join(rootdir, '**/*{}'.format(ext))
    glob_gen = glob(glob_wildcard, recursive=True)
    return max(glob_gen, key=lambda fn: os.stat(fn).st_mtime, default='?')
或者更简洁地说:


酷。我不知道这一点。谢谢,我测试了这个,它工作正常,但我通常使用Python 2(macOS默认情况下不附带Python 3!),它没有默认设置(在
学习Python
中也没有提到)@TimPietzcker Yesss!测试空列表的真实性。更新了,谢谢。我喜欢这个,因为它理顺了代码,很好地明确了正在发生的事情。@TimPietzcker同意。一个更好的解决方案(尽管不那么pythonic)是从理解中删除嵌套循环!
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='?')