使用shutil和字典复制文件夹

时间:2018-01-10 03:57:24

标签: python

我的目标是将文件夹复制到不同的位置,目录的结构是这样的,我有多个文件夹,其中有自己的子文件夹,我不希望所有子文件夹被复制,我只想要一个特定的三个它们。

我创建了一个字典,其中键是主文件夹的名称,值又是我想要的三个文件夹的字母,其中键是我想要的文件夹类型,值是文件夹中的名称我要复制的原始目录。

看起来像这样:

't0107': {'Arteirial': 'ARTERIAL THIN',
'Portal': '5mm portal',
'Venous': 'VENOUS THIN'},
't011': {'Arteirial': 'ARTERIAL THIN_0131',
'Portal': '5mm portal',
'Venous': 'VENOUS THIN'},
't0112': {'Arteirial': 'Thin Arterial Phase',
'Portal': 'Thin Portal Phase',
'Venous': 'Thin Venous Phase'},
't0113': {'Arteirial': 'Thin Arterial Phase',
'Portal': 'Thin Portal Phase',
'Venous': 'Thin Venous Phase'},

我试图使用shutil.copytree在我尝试

的地方完成此操作
def copytree(src, dst, symlinks=False,ignore = None):
    for item in os.listdir(src):
        s = os.path.join(src, item)
        d = os.path.join(dst, item)
        if os.path.isdir(s):
            shutil.copytree(s, d, symlinks, ignore)
        else:
            shutil.copy2(s, d)
path = '/media/username/ce162bb5-5654-4c36-9db2-55c7728ddb5a/CT/Anup/PhaseWise/'

for item in data_dict.keys():
   copytree(str(path)+str(item)+'/'+data_dict[item]['Arteirial']+'/','/media/username/da5df9e4-cdc6-4d55-91e8-b2383e89165f/lion/'+str(item))

没有工作,欢迎任何建议,提前致谢

编辑: 代码有效,但有问题,

复制目录时,因为我在循环中运行命令os.mkdir(dist_path+level1+level2),它将转到目标 并创建一个目录t004ARTERIAL THIN t004VENOUS THIN有什么方法可以让程序首先制作t004目录 然后在里面制作ARTERIAL THIN.VENOUS THIN等文件夹然后转移?

root_path = "/media/username/ce162bb5-5654-4c36-9db2-55c7728ddb5a/LiverCT/Anup/PhaseWise/"
dist_path = "/media/username/da5df9e4-cdc6-4d55-91e8-b2383e89165f/lion/"

for level1,value1 in data_dict.items():
    for level2, value2 in value1.items():
        src_path = os.path.join(root_path,str(level1),str(value2))
        os.mkdir(dist_path+level1+level2)
    #print (src_path)
        copytree(src_path,dist_path+level1+level2)

1 个答案:

答案 0 :(得分:1)

一些建议:

  1. 使用os.path.join()替换字符串连接。

  2. shutil.copytree会将源文件夹中的所有文件夹和文件复制到dist文件夹。没必要再打包。

  3. 演示代码:

    d = {'t0107': {'Arteirial': 'ARTERIAL THIN',
    'Portal': '5mm portal',
    'Venous': 'VENOUS THIN'},
    't011': {'Arteirial': 'ARTERIAL THIN_0131',
    'Portal': '5mm portal',
    'Venous': 'VENOUS THIN'},
    't0112': {'Arteirial': 'Thin Arterial Phase',
    'Portal': 'Thin Portal Phase',
    'Venous': 'Thin Venous Phase'},
    't0113': {'Arteirial': 'Thin Arterial Phase',
    'Portal': 'Thin Portal Phase',
    'Venous': 'Thin Venous Phase'}}
    
    src_path = "/home/username/src"
    dst_path = "home/username/dst"
    for level1,value1 in d.iteritems():
        for level2, value2 in value1.iteritems():
            from_path = os.path.join(src_path,level1,level2,value2)
            to_path = os.path.join(dst_path,level1,level2,value2)
            print from_path
            # os.mkdir(to_path)
            shutil.copytree(from_path,to_path) # the to_path will be created automatically, if the to_path is exists, it will raise OSError: [Errno 17] File exists.
    

    输出行:

    /home/username/src/t011/Arteirial/ARTERIAL THIN_0131
    /home/username/src/t011/Venous/VENOUS THIN
    /home/username/src/t011/Portal/5mm portal
    /home/username/src/t0113/Arteirial/Thin Arterial Phase
    /home/username/src/t0113/Venous/Thin Venous Phase
    /home/username/src/t0113/Portal/Thin Portal Phase
    /home/username/src/t0112/Arteirial/Thin Arterial Phase
    /home/username/src/t0112/Venous/Thin Venous Phase
    /home/username/src/t0112/Portal/Thin Portal Phase
    /home/username/src/t0107/Arteirial/ARTERIAL THIN
    /home/username/src/t0107/Venous/VENOUS THIN
    /home/username/src/t0107/Portal/5mm portal