2017-06-18 15 views
2

このサイトで恥知らずに見つけた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の初心者だということを認めて、そして最後の行は、私の給与等級を超えた方法です。

どのようにエラーをトラップして機能がクラッシュするのを防ぐことができますか?

答えて

4

あなたは、あなたが最新のものを選んで、そこからファイルの非空のリストを持っているときにのみmaxが呼び出されたことを確認するために、二つの別々の行にそのものすごいニシキヘビ1つのライナーを分離することができます

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 

@ hiroprotagonistのソリューションほど美しいものではありませんが、読みやすくなっています。

+0

@TimPietzcker YESSS!空リストの真実性をテストする。更新しました、ありがとうございます。 –

+1

私はこれが好きです。なぜなら、コードが不明瞭になり、何が起こっているのかがうまく明示されているからです。 –

+0

@TimPietzcker合意。その理解からネストされたループを削除することは、(たとえPythonのほうが少ないにしても)さらに優れたソリューションです! –

7

maxdefaultキーワードがあります。

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

反復可能が空の場合はdefaultが返されます。 defaultがなければ、ValueErrorとなります。


あなたが行くための別の方法は、ファイルを一覧表示するためにglobを使用することです:

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='?') 

あるいはより簡潔なpathlibと:

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='?') 
+0

クール。これを知らなかった –

+0

ありがとう、私はこれを試して、それは働いたが、私は通常Python 2(macOSはデフォルトでPython3に付属していない!)を持っています( 'Learning Python'でも言及されていない) – Milliways

+0

@Milliways:あなたは正しいこれはPython 3の新機能です。 –

関連する問題