Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
删除Python中的旧目录_Python_Time_Directory_Timestamp - Fatal编程技术网

删除Python中的旧目录

删除Python中的旧目录,python,time,directory,timestamp,Python,Time,Directory,Timestamp,我有几个目录,我想超过7天的旧目录被删除。我已经实现了代码,但它似乎不起作用。谁能看出我错在哪里 def delete_sandbox(): for directories in os.listdir(os.getcwd()): if not os.path.isdir(directories) or not os.stat(directories).st_ctime < time.time()-(7*24*3600): contin

我有几个目录,我想超过7天的旧目录被删除。我已经实现了代码,但它似乎不起作用。谁能看出我错在哪里

def delete_sandbox():

    for directories in os.listdir(os.getcwd()): 

        if not os.path.isdir(directories) or not os.stat(directories).st_ctime < time.time()-(7*24*3600): 
            continue
        os.chdir(directories)
        drop_sandbox()
        os.chdir(rootDir)
        os.system("sudo rm -rf "+directories)
        print 'Folders older than 7 days old dropped and removed'
是否有其他方法删除这些文件夹

我让它工作了,我使用了
shutil.rmtree
,一切似乎都工作了。谢谢你的帮助。经修订的守则是:

def delete_sandbox():

    for directories in os.listdir(os.getcwd()): 

        if not os.path.isdir(directories) or not os.stat(directories).st_ctime < time.time()-(sbox_age): 
            continue
        os.chdir(directories)
        drop_sandbox()
        os.chdir(rootDir)
        shutil.rmtree(directories)
        print 'Sandboxes older than 7 days old dropped and removed'

delete_sandbox()
def delete_sandbox():
对于os.listdir(os.getcwd())中的目录:
如果不是os.path.isdir(目录)或不是os.stat(目录).st_ctime
os.listdir返回字符串列表,这些字符串是相对路径。当您chdir到rootdir时,取决于rootdir是什么,这些路径可能不再有效

  • drop\u sandbox()
    做什么?(你给我们的函数是
    delete\u sandbox()
    )也许你的意思是这是一个递归函数,使用了错误的函数名
  • rootDir是全局变量吗?也许你的意思是
    os.chdir(“…”)
  • rootDir
    包含什么
    os.listdir
    提供相对路径。如果
    rootDir
    是搜索的基础,则列出的目录可能无法工作。更糟糕的是:如果他们这样做了,你可能会删除你仍然想要的东西

此外,
shutil
包有一个
rmtree
函数,您可能需要研究它。

虽然公认答案的总体思路是合理的,但实现有几个要点是不合理的

import os
import time
import shutil
numdays = 86400*7
now = time.time()
directory=os.path.join("/home","path")
for r,d,f in os.walk(directory):
    for dir in d:
         timestamp = os.path.getmtime(os.path.join(r,dir))
         if now-numdays > timestamp:
             try:
                  print "removing ",os.path.join(r,dir)
                  # shutil.rmtree(os.path.join(r,dir))  #uncomment to use
             except Exception,e:
                  print e
                  pass
             else: 
                  print "some message for success"
  • 变量名不按字符收费
  • 请不要覆盖像dir()这样的python方法
  • 因为我需要更多的功能,所以我采纳了你的想法,构建了这个:

    class CompRM(object):
        exception_list = []
        path = None
        comparator = None
        comparator_target = None
        comparator_delete_condition = None
    
        delete_directories = False
        delete_files = False
    
        def __init__(self, target_path, comparator, comparator_target='st_mtime', comparator_delete_condition='>', delete_directories=False, delete_files=False):
            self.path = target_path
            self.comparator = comparator
            self.comparator_target = comparator_target
            self.comparator_delete_condition = comparator_delete_condition
    
            for directory_path, directory_names, file_names in os.walk(self.path):
                if delete_directories is True:
                    self.walk_names(directory_path, directory_names)
                if delete_files is True:
                    self.walk_names(directory_path, file_names)
    
            if len(self.exception_list) > 0:
                raise Exception({'message': 'Encountered exceptions while deleting.', 'debug': self.exception_list})
    
        def walk_names(self, directory_path, names):
            for _name in names:
                _path = os.path.join(directory_path, _name)
                _stat = os.stat(_path)
                _value = getattr(_stat, self.comparator_target)
                if self.delete_condition_met(_value):
                    self.safe_remove(_path)
    
        def delete_condition_met(self, value):
            if self.comparator > value and self.comparator_delete_condition is '>':
                return True
            if self.comparator < value and self.comparator_delete_condition is '<':
                return True
            return False
    
        def safe_remove(self, remove_path):
            print 'remove', remove_path
            shutil.rmtree(remove_path, onerror=self.register_exception)
    
        def register_exception(self, function, path, exception_info):
            self.exception_list.append({
                function: function,
                path: path,
                exception_info: exception_info,
            })
    
    其中,comparator_target是os.stat()中用于比较的attributename

    问候,,
    Justus

    什么意思似乎不起作用?您是否收到任何错误消息?如果某些目录名包含空格(在os.system调用时),或者条目中的当前目录不是
    rootDir
    ,则此操作将失败。您是否有错误,如果有,是什么,在哪里?或者意外的行为,如果是的话是什么,在哪里?一些
    print
    s将向我们提供更多信息(您当前提供的信息约为0位;-)。在呼叫系统时,特别是涉及“rm”时,一般建议/警告。为函数指定一个默认为True的干运行选项,该选项打印它将运行的系统命令。
    exception\u list=[]
    在类级别是一个bug。该列表在实例之间共享。易变属性总是需要在
    \uuuu init\uuuu
    中设置以避免这种情况(通常,对所有要在实例上设置/使用的属性都这样做是一个好主意,并且只有当您确实想在类级别上访问它们时才使用类级别的属性),
    对于比较来说是错误的。使用
    ==
    进行检查-is检查相同的对象,这是完全一致的,并且是一个对某些短字符串有效的实现细节。
    class CompRM(object):
        exception_list = []
        path = None
        comparator = None
        comparator_target = None
        comparator_delete_condition = None
    
        delete_directories = False
        delete_files = False
    
        def __init__(self, target_path, comparator, comparator_target='st_mtime', comparator_delete_condition='>', delete_directories=False, delete_files=False):
            self.path = target_path
            self.comparator = comparator
            self.comparator_target = comparator_target
            self.comparator_delete_condition = comparator_delete_condition
    
            for directory_path, directory_names, file_names in os.walk(self.path):
                if delete_directories is True:
                    self.walk_names(directory_path, directory_names)
                if delete_files is True:
                    self.walk_names(directory_path, file_names)
    
            if len(self.exception_list) > 0:
                raise Exception({'message': 'Encountered exceptions while deleting.', 'debug': self.exception_list})
    
        def walk_names(self, directory_path, names):
            for _name in names:
                _path = os.path.join(directory_path, _name)
                _stat = os.stat(_path)
                _value = getattr(_stat, self.comparator_target)
                if self.delete_condition_met(_value):
                    self.safe_remove(_path)
    
        def delete_condition_met(self, value):
            if self.comparator > value and self.comparator_delete_condition is '>':
                return True
            if self.comparator < value and self.comparator_delete_condition is '<':
                return True
            return False
    
        def safe_remove(self, remove_path):
            print 'remove', remove_path
            shutil.rmtree(remove_path, onerror=self.register_exception)
    
        def register_exception(self, function, path, exception_info):
            self.exception_list.append({
                function: function,
                path: path,
                exception_info: exception_info,
            })
    
    comprm = CompRM('/tmp', time.time() - 60*60*24*7, comparator_target='st_ctime', delete_files=True)