ah bon
ah bon

Reputation: 10021

Copy files from multiple specific subfolders

Under the file path D:/src, I have images folders and its subfolders which have a regular structure as follows:

Folder A
- Subfolder a
- Subfolder b
- Subfolder c
Folder B
- Subfolder a
- Subfolder b
- Subfolder c
- Subfolder d
Folder C
- Subfolder a
- Subfolder b
- Subfolder c
...

I want to copy all .jpg files in Subfolder b from Folder A, B, C and so on to a new folder Subfolder b in D:/dst. How can I do it in Python? Thanks.

Subfolder b
-xxx.jpg
-xyx.jpg
-yxz.jpg
...

Here is what I have found from the following link may helps:

Copy certain files from one folder to another using python

import os;
import shutil;
import glob;

source="C:/Users/X/Pictures/test/Z.jpg"
dest="C:/Users/Public/Image"

    if os.path.exists(dest):
    print("this folder exit in this dir")
else:
    dir = os.mkdir(dest)

for file in glob._iglob(os.path.join(source),""):
    shutil.copy(file,dest)
    print("done")

Upvotes: 1

Views: 6467

Answers (4)

user15950808
user15950808

Reputation:

import shutil
import os
 
 
def move_files(source_director, destination_director):
    # select the files in the source directory
    fisiere = [fisier for fisier in os.listdir(source_director) if os.path.isfile(os.path.join(source_director, fisier))]
    print(fisiere)
    # each file in the source directory is moved to the destination directory
    for fisier in fisiere:
        shutil.move(source_director + '\\' + fisier, destination_director)
 
def copy_files(source_director, destination_director):
    # select the files in the source directory
    fisiere = [fisier for fisier in os.listdir(source_director) if os.path.isfile(os.path.join(source_director, fisier))]
    print(fisiere)
    # each file in the source directory is copied to the destination directory
    for fisier in fisiere:
        shutil.copy(source_director + '\\' + fisier, destination_director)
 
if __name__ == '__main__':
     # WARNING: paths to directories must be written with '\\' (double backslash)
     # here you set the DIN directory you want to move / copy the files

    source_director = 'c:\\Folder'
 
    destination_director = 'c:\\Folder\\Subfolder1\\Subfolder2'
 
    #CASE 1
    # move_files(source_director, destination_director)
 
    #CASE 2
    copy_files(source_director, destination_director)

THE SOURCE OF THIS CODE HERE:

https://neculaifantanaru.com/en/python-copy-or-moves-files-from-a-folder-to-another-folder.html

Upvotes: 1

glhrsh
glhrsh

Reputation: 383

Here's a short script that should do the work...

import os

# list all the directories in current directory
dirs = [x[0] for x in os.walk("D:/src")]

for d in dirs:
    ## list all files in A/b/*, B/b/*, C/b/*...
    files_to_copy = os.listdir(os.path.join(d, "b"))  
    for f in files_to_copy:
        if f.endswith(".jpg"):  ## copy the relevant files to dest
            shutil.copy(os.path.join(d, "b", f), os.path.join(dest, f))

Upvotes: 1

DollarAkshay
DollarAkshay

Reputation: 2122

Assuming you have 2 levels of nesting

root_dir = './data'
dest_dir = './new_location'
os.listdir(root_dir)

for folder in os.listdir(root_dir):
    folder_path = os.path.join(root_dir, folder)
    if os.path.isdir(folder_path):
        for subfolder in os.listdir(folder_path):
            if subfolder == 'Subfolder B':
                subfolder_path = os.path.join(root_dir, folder, subfolder)
                print(subfolder_path)
                for filename in os.listdir(subfolder_path):
                    file_path = os.path.join(root_dir, folder, subfolder, filename)
                    dest_path = os.path.join(dest_dir, filename)
                    shutil.copy(file_path, dest_path)
                    print("Copied ", file_path, "to", dest_path)

You just need 2 for loops, and in the the inner for loop you just check whether the folder name matches Subfolder B. If it does then copy all the files inside that directory to your destination folder.

Upvotes: 1

grapes
grapes

Reputation: 8636

Try this

import os
from os.path import join, isfile

BASE_PATH = 'd:/test'
SUBFOLDER = 'Subfolder b'

for folder, subfolders, *_ in os.walk(BASE_PATH):
    if SUBFOLDER in subfolders:
        full_path = join(BASE_PATH, folder, SUBFOLDER)
        files = [f for f in os.listdir(full_path) if isfile(join(full_path, f)) and f.lower().endswith(('.jpg', '.jpeg'))]
        for f in files:
            file_path = join(full_path, f)
            print (f'Copy {f} somewehere')

Upvotes: 2

Related Questions