2

如何简洁地表达“获取所有超过 x 天的文件夹”

我有一个方法getOldDirs(dirPath,olderThanDays),它必须遍历给定的根文件夹并返回一个早于7天的文件夹列表。

我从另一个函数 cleanOldFolders() 调用上述函数。cleanOldFolders() 将删除那些类似于“rm -Rf

我拥有的代码,如何简洁地修改循环:

"""
Clean oldFolders
"""
def cleanOldFolders(self):
    pathString = self.folderRoot + '/' + self.configMode + '/' + self.appId
    oldDirList = self.getOldDirs(pathString, 7);
    # Notify user that the following folders are deleted

    # remove all old dirs perhaps using shutil.removetree for each folder oldDirList, rm -Rf

    return

获取旧目录:

"""
get all subfolders under dirPath older than olderThanDays
"""
def getOldDirs(self,dirPath, olderThanDays):
    # What is the concise way of expressing Get me list of all dir/subdirs from "dirPath" that are older than "olderThanDays"
    # I know I have to use os.walk,
    # I want a concise loop like this - but should recurse using os.walk
    a = [os.path.join(dirPath, myfile) for myfile in os.listdir(dirPath)
            if (os.path.isdir(os.path.join(dirPath, myfile)) and
                (self.isOlder(os.path.join(dirPath, myfile), olderThanDays))
        )]

#  for root, dirs, files in os.walk(dirPath):
#      for name in dirs:
#          print os.path.join(root, name)

    return a
4

3 回答 3

5

关于os.walk()它的好处之一是它为您执行递归。对于它在您的应用程序中的使用,指定可选的关键字参数topdown很重要,因为False它的默认值是True并且os.rmdir()不会删除非空目录。

这意味着您的代码需要在删除子目录本身之前删除它遇到的每个子目录中的所有文件和子目录。为了便于执行此操作,返回的目录列表getOldDirs()应按照需要删除子目录的顺序排列。

还需要注意的是,在下文中,目录的年龄是用小数天数计算的,而不是整数天,这意味着秒数,并且仅说 6 天 23 小时 59 秒的那个不会被放入在要删除的列表上,即使它距离足够大只有两秒钟的时间。

import os
import time

def getOldDirs(self, dirPath, olderThanDays):
    """
    return a list of all subfolders under dirPath older than olderThanDays
    """
    olderThanDays *= 86400 # convert days to seconds
    present = time.time()
    for root, dirs, files in os.walk(dirPath, topdown=False):
        for name in dirs:
            subDirPath = os.path.join(root, name)
            if (present - os.path.getmtime(subDirPath)) > olderThanDays:
                yield subDirPath
于 2012-12-07T20:22:50.443 回答
3

这应该是一个起点。

import os
from time import time as _time

SEVEN_DAYS = 60*60*24*7

def get_old_dirs(dir_path, older_than=SEVEN_DAYS):
    time_now = _time()
    for path, folders, files in os.walk(dir_path):
        for folder in folders:
            folder_path = os.path.join(path, folder)
            if (time_now - os.path.getmtime(folder_path)) > older_than:
                yield folder_path

list_of_folders = list(get_old_dirs("/some/path"))

此外,如果您不想进入older_than几天前的文件夹(因为您要删除它们),您可以修剪搜索树,从folders列表中删除文件夹名称

def get_old_dirs(dir_path, older_than=SEVEN_DAYS):
    time_now = _time()
    for path, folders, files in os.walk(dir_path):
        for folder in folders[:]:
            folder_path = os.path.join(path, folder)
            if (time_now - os.path.getmtime(folder_path)) > older_than:
                yield folder_path
                folders.remove(folder)
于 2012-12-07T19:19:28.570 回答
0

这使用 os.walk 并为您获取超过 7 天的文件列表

import os
from datetime import date

old_dirs = []
today = date.today()

for root, dirs, files in os.walk(start_path):
    for name in dirs:
        filedate = date.fromtimestamp(os.path.getmtime(os.path.join(root, name)))
        if (today - filedate).days > 7:                                            
            old_dirs.append(name)
于 2012-12-07T19:30:02.930 回答