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

古いdirsを取得します。

"""
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

良い点の1つはos.walk()、それがあなたのために繰り返しを行うことです。アプリケーションで使用するには、オプションのキーワード引数をトップダウンで指定することが重要です。これは、Falseデフォルトでは空でないディレクトリが削除されるためです。Trueos.rmdir()

つまり、コードは、サブディレクトリ自体を削除する前に、検出した各サブディレクトリ内のすべてのファイルとサブディレクトリを削除する必要があります。これを容易にするために、ディレクトリリストのgetOldDirs()戻り値は、サブディレクトリを削除する必要がある順序にする必要があります。

また、以下では、ディレクトリの経過時間は全体ではなく小数で計算されることに注意することも重要です。これは、秒数がカウントされ、6日23時間59秒しか経過していないことを意味します。十分に古くなってからわずか2秒ですが、削除されるリストにあります。

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 に答える