【问题标题】:How to find the most recently modified folder in a directory of directories (python)?如何在目录(python)目录中找到最近修改的文件夹?
【发布时间】:2012-07-31 09:59:09
【问题描述】:

根据我找到的其他答案,我已经给了它一个不错的尝试,但没有解决任何可靠的问题(我的解决方案非常缓慢,但也许没有其他方法)。基本上,我有一个名为“scratch”的文件夹,用户可以在其中创建自己的文件夹来转储他们的数据。
我需要我的脚本来找出哪些用户的文件夹超过 30 天没有使用。我想我可以通过在用户文件夹中找到最近修改的目录(通过递归搜索)然后过滤掉较旧的目录来做到这一点。

获取用户目录列表的代码:

    dirlist = list()
    for filename in os.listdir("\\\\abg-netapp1\\Scratch\\"):
        dirlist.append(filename)

然后我可以遍历 'dirlist' 的每个索引来创建一个完整的搜索路径:

    x=0
    for item in dirlist:
        max_mtime = 0
        for dirname,subdirs,files in os.walk("\\\\abg-netapp1\\Scratch\\" + dirlist[x]):
            for fname in subdirs:
                full_path = os.path.join(dirname, fname)
                mtime = os.stat(full_path).st_mtime
                if mtime > max_mtime:
                    max_mtime = mtime
                    max_dir = dirname
                    max_file = fname
        print max_dir, max_file, time.strftime('%Y-%m-%d', time.localtime(max_mtime))
        x+=1

我确实知道我还没有过滤掉超过 30 天的目录,只是想看看我是否可以使用这段代码进行更改。
我是不是走错了路,有没有更简单的解决方案?如有任何问题或其他任何问题,请告诉我,谢谢!

【问题讨论】:

    标签: python directory


    【解决方案1】:

    我会使用:

    import os
    from os.path import join
    from datetime import datetime, timedelta
    from operator import itemgetter
    
    
    def list_user_files(username):
        for root, dirs, files in os.walk(username):
            for name in files:
                fullname = join(root, name)
                try:
                    yield fullname, os.stat(fullname).st_mtime
                except (IOError, OSError) as e: # will catch WindowsError but more generic
                    pass # Do something here...
    
    
    ROOT = '/home'
    CUTOFF = timedelta(days=30)
    for userdir in os.listdir(ROOT):
        most_recent = max(list_user_files(join(ROOT, userdir)), key=itemgetter(1))
        print '{}: most recent file and timestamp is {}'.format(userdir, most_recent)
        if (datetime.now() - datetime.fromtimestamp(most_recent[1])) > CUTOFF:
            print '{} has not used their folder during cutoff period'.format(userdir)
    

    调试max ValueError(将其替换为most_recent= 行):

    try:
        most_recent = max(list_user_files(join(ROOT, userdir)), key=itemgetter(1))
    except ValueError as e:
        print '***DEBUG***', list(list_user_files(join(ROOT, userdir)))
    

    【讨论】:

    • 似乎可以正常工作,直到找到具有某种权限的文件:WindowsError:[错误 5] 访问被拒绝:'\\\\abg-netapp1\\Scratch\\user\\file .知道如何忽略这些吗?
    • @AshleyJohnKent 稍作修改并包括异常处理
    • @AshleyJohnKent 我能想到的唯一原因是我在发布的代码中有错字 - get_files 应该是 list_user_files
    • 我已经注意到了,所以我不相信这是原因!
    • @AshleyK 检查修改后的答案以获取说明
    【解决方案2】:

    首先创建一个目录列表,然后按st_mtime排序。

    >>> root_path = '/foo/bar/zoo/'
    >>> l = [fname for fname in os.listdir(root_path) if os.path.isdir(os.path.join(root_path,fname))]
    >>> sorted(l,key=lambda x: os.stat(os.path.join(root_path,x)).st_mtime)
    

    【讨论】:

    • 我需要在整个文件夹中找到最近修改的目录(即使这意味着它是 10 个文件夹,因此我使用 os.walk 递归检查每个文件夹)。
    • 我意识到这一点,但您要求更好的方法,这就是我发布的内容。只需相应地调整您的循环。
    最近更新 更多