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