我是一个python新手(到目前为止,我只精通bash脚本)并且我有一个关于递归的问题和shutil.rmtree
。
所以,我有以下片段......
keepthese = ('dir1', 'dir2', '.dotfile1', '.dotfile2', 'dir3', '.dotdir1')
dirpath = '/home/' + username + '/parentdir/'
killthese = [os.path.join('/home', username, '/parentdir', item) for item in os.listdir(dirpath) if item not in keepthese]
for x in killthese:
if os.path.isdir(x):
shutil.rmtree(x)
else:
os.remove(x)
(是的,我知道它看起来不太干净)。
基本上,我有一组文件名/目录。对于此示例,我将使用dir1
。
现在,我有一个在dir1
中递归的目录布局,还会有另一个名为dir1
,.dotdir
等的目录。
我想要做的是保持第一级层次结构(显然删除parentdir /中与keepthese不匹配的每个文件/目录),但是在keepthese中列出的每个目录中,我想要删除所有内容(因此我不能仅基于名称进行递归,否则我将删除第一级keepthese
次迭代)。
这有意义吗?
答案 0 :(得分:1)
假设你想:
然后这样的(未经测试的!)脚本应该可以工作:
import sys, os, shutil
def prune(dirpath, exceptions=()):
for name in os.listdir(dirpath):
path = os.path.join(dirpath, name)
if name in exceptions:
prune(path)
else:
if os.path.isdir(path):
shutil.rmtree(path)
else:
os.remove(path)
exceptions = ('dir1', 'dir2', '.dotfile1', '.dotfile2', 'dir3', '.dotdir1')
if __name__ == '__main__':
root = os.path.join('/home', sys.argv[1], 'parentdir')
prune(root, exceptions)
答案 1 :(得分:0)
我尝试使用os.walk,比如......
for root, dirs, files in os.walk(dirpath, topdown=False):
for name in files:
os.remove(os.path.join(root, name))
for name in dirs:
if name not in keepthese:
os.rmdir(os.path.join(root, name))