根据Python中的名称将文件从单独的子目录移动到另一个子目录

问题描述

给出目录./及其子目录('project1,project2,project3,...')文件结构,如下所示:

├── project1
│   ├── file1
│   ├── file2
│   ├── process
│   │   └── f1
│   │       ├── pic1.png
│   │       └── pic2.jpg
│   ├── progress
│   │   └── f2
│   │       ├── 623.jpg
│   │       └── pic2323.png
│   └── session
│       └── f3
│           ├── 5632116.jpg
│           └── 72163.png
└── project2
    ├── file1
    ├── file2
    ├── process
    │   └── f1
    │       ├── pic1.png
    │       └── pic2.jpg
    ├── progress
    │   └── f2
    │       ├── 623.jpg
    │       └── pic2323.png
    └── session
        └── f3
            ├── 5632116.jpg
            └── 72163.png

对于每个project文件夹,我需要将图片process移动到空白files1,从progresssession移动到空白files2

预期结果如下:

|── project1
|   ├── file1
|   │     ├── pic1.png
|   │     └── pic2.jpg
|   |── file2
|         ├── 623.jpg
|         └── pic2323.png
|         ├── 5632116.jpg
|         └── 72163.png
└── project2
    ├── file1
    │     ├── pic1.png
    │     └── pic2.jpg
    |── file2
          ├── 623.jpg
          └── pic2323.png
          ├── 5632116.jpg
          └── 72163.png

我的试用代码有效,但我认为它不够简洁,欢迎对其进行改进:

base_dir = './'
src_dst_map = {
   'session': 'files1','process': 'files2','progress': 'files2'
}

for child in os.listdir(base_dir):
    # print(child)
    child_path = os.path.join(base_dir,child)
    # print(child_path)
    # src_path = os.path.join(child_path,'session')
    # print(src_path)
    for src,dst in src_dst_map.items():
        # print(src)
        src_path = os.path.join(child_path,src)
        dst_path = os.path.join(child_path,dst)
        print(src_path)
        print(dst_path)
        for root,dirs,files in os.walk(src_path):
            # print(root)
            for file in files:
                # print(file)
                srce_path = os.path.join(root,file)
                print(srce_path)
                shutil.move(srce_path,dst_path)
        shutil.rmtree(src_path,ignore_errors = True)

解决方法

说实话,这已经很简洁了并且可以完成工作,因此我不会为更改它而烦恼。您的代码运行10行(加上字典和基本路径的设置)。

对于重复的图像,您可以检查file中是否存在dst_path,如果存在,请在已复制文件中添加前缀(或后缀)。

在下面,添加根据源的前缀,直到找到唯一的文件名。如果在一个子文件夹中有多个相同文件的副本,这也将引起注意。您可以根据自己的特定需求进行更改,但这应该可以为您提供总体思路。

...

    for root,dirs,files in os.walk(src_path):
        for file in files:
            srce_path = os.path.join(root,file)
            while os.path.isfile(os.path.join(dst_path,file)):
                file = '_'.join([src,file])
            shutil.move(srce_path,os.path.join(dst_path,file))

我选择了一个前缀,因为它更容易实现。在文件名和文件结尾之间必须添加后缀,这将需要一些附加代码。