Search code examples
pythonoperating-systemsubdirectory

How to copy image from sub_subfolders to only one folder using python


I want to copy images from multi subfolders into only one folder using python or any library that can do with python framework my folders as described in tree below

$ tree
.
├── main_folder
│   ├── Subfolder_1
│   │   └── Subfolder1_1
│   │       └── ├── 0.png
│   │           ├── 1.png
│   │           ├── 2.png
│   │           └── 3.png
│   │   └── Subfolder1_2
│   │       └── ├── 4.png
│   │           ├── 5.png
│   │           ├── 6.png
│   │           └── 7.png
        .....

│   ├── Subfolder_2
│   │   └── Subfolder2_1
│   │       └── |____.png
│   │           ├── 8.png
│   │           └── 9.png
│   │   └── Subfolder2_2
│   │       └── ├── 10.png
│   │           ├── 11.png
│   │           ├── 12.png
│   │           └── 13.png
│   └── Subfolder_3
│       └── Subfolder3_1
│           └── |___ .png
│               ├── 14.png
│               ├── 15.png
│               ├── 16.png
│   │   └── Subfolder3_2
│   │       └── ├── 17.png
│   │           ├── 18.png
│   │           ├── 19.png
│   │           └── 20.png
│   
└── script.py

The expected results destination_folder will look like the tree below

   ── destination_folder
          ├── 0.png
          ├── 1.png
          ├── 2.png
          └── 3.png
          .........
          ├── n-1.png
          └── n.png

Solution

  • just use a mixture of glob for finding files and shutil for copying files.

    import glob
    import os
    import shutil
    
    dest_folder = 'destination_folder'
    if not os.path.isdir(dest_folder):
        os.mkdir(dest_folder)
    
    for item in glob.glob('**/*.png',recursive=True):
        filename = os.path.basename(item)
        full_path = os.path.abspath(item)
        shutil.copy(full_path, os.path.join(dest_folder,filename))
    

    if you only want pictures with numbers you can add an if condition to it

    for item in glob.glob('**/*.png',recursive=True):
        filename = os.path.basename(item)
        if filename.split('.')[0].isdigit():
            full_path = os.path.abspath(item)
            shutil.copy(full_path,os.path.join(dest_folder,filename))