Python 如何删除根目录中包含文件、目录、链接和不能删除的特殊文件的目录内容?

Python 如何删除根目录中包含文件、目录、链接和不能删除的特殊文件的目录内容?,python,Python,我需要清空一个目录,但保存一些特殊文件。要清理的目录包含文件、目录和符号链接。我如何验证我删除了正确的内容并保留了正确的内容?我写了一些方法,用测试材料整理我的tmp文件夹。我需要的实际方法称为“directoryclean” 结果比我想象的要难。os.remove似乎无法处理符号链接。removedirs提出了一些我不理解的例外情况 #!/usr/bin/env python

我需要清空一个目录,但保存一些特殊文件。要清理的目录包含文件、目录和符号链接。我如何验证我删除了正确的内容并保留了正确的内容?

我写了一些方法,用测试材料整理我的tmp文件夹。我需要的实际方法称为“directoryclean”

结果比我想象的要难。os.remove似乎无法处理符号链接。removedirs提出了一些我不理解的例外情况

#!/usr/bin/env python                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               

import os
import sys
import shutil
import random
import string
import itertools

def randomstring( stringlen ):
    return ''.join( random.choice( string.lowercase ) for _ in range( stringlen ) )

def flufffilemake( filename ):
    with file( filename, 'wt+' ) as f:
        for i in range( 10 ):
            f.write( randomstring( 1000 ) )

def fluffdirmake( root, maxdepth=5 ):
    if root.count( '/' ) <= maxdepth:
        for i in range( random.randint( 0, 5 ) ):
            dirname = os.path.join( root, randomstring( 4 ) )
            os.mkdir( dirname )
            fluffdirmake( dirname )
            for i in range( random.randint( 0, 10 ) ):
                flufffilemake( os.path.join( dirname, randomstring( 5 ) ) )

def fluffsymlinksmake( top, sympath ):
    for root, dirs, files in os.walk(top):
        for name in files:
            if random.randint( 0, 3 ) == 0:
                randomname = randomstring( 6 )
                symlinktarget = os.path.join( sympath, randomname )
                flufffilemake( symlinktarget )
                os.symlink( symlinktarget, os.path.join( root, randomname ) )
        for name in dirs:
            if random.randint( 0, 3 ) == 0:
                randomname = randomstring( 6 )
                symlinktarget = os.path.join( sympath, randomname )
                os.makedirs( symlinktarget )
                os.symlink( symlinktarget, os.path.join( root, randomname ) )


def directoryclean( top, specialfiles ):
    for root, dirs, files in os.walk( top, topdown=False ):
        for df in itertools.chain( dirs, files ):
            p = os.path.join( root, df )
            if not df in specialfiles:
                try:
                    os.unlink( p ) # this works for both links to files and links to directories and also plain files
                except OSError:
                    shutil.rmtree( os.path.join( root, df ), ignore_errors=True )


if __name__ == '__main__':
    root        = '/tmp/dirdel'
    sym         = '/tmp/sym'
    try:
        os.makedirs( root )
        os.makedirs( sym )
    except:
        pass

    specialfiles = [ 'specialfile%d' % i for i in range( random.randint( 0, 5 ) ) ]
    for f in specialfiles:
        with file( os.path.join( root, f ), 'wt' ) as f:
            f.write( '   ' )

    fluffdirmake( root )
    fluffsymlinksmake( root, sym )
    for f in specialfiles:
        flufffilemake( os.path.join( root, f ) )

    sys.stdin.read( 1 ) # wait for keypress so I can manually inspect the created files
    directoryclean( root, specialfiles )

    for f in specialfiles:
        assert os.path.exists( os.path.join( root, f ) )
    remainingfiles = os.listdir( root )
    assert len( remainingfiles ) == len( specialfiles )
#/usr/bin/env python                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   
导入操作系统
导入系统
进口舒蒂尔
随机输入
导入字符串
进口itertools
定义随机字符串(stringlen):
返回“”。为范围内的uu(stringlen))加入(random.choice(string.lowercase))
def flufffilemake(文件名):
将文件(文件名为“wt+”)作为f:
对于范围(10)内的i:
f、 写入(随机字符串(1000))
def fluffdirmake(根,最大深度=5):
如果root.count(“/”)