Скопируйте определенные подкаталоги по их имени с помощью Python

Если у меня есть папка с несколькими подпапками, каждая из них имеет одинаковую структуру sub1, sub2 и sub3:

├─a
│  ├─sub1
│  ├─sub2
│  └─sub3
├─b
│  ├─sub1
│  ├─sub2
│  └─sub3
└─c
    ├─sub1
    ├─sub2
    └─sub3
...

Я хочу скопировать sub1 и sub2, если внутри есть файлы изображений, и игнорировать другие подпапки (sub3...), сохраняя при этом древовидную структуру каталога. Это ожидаемый результат:

├─a
│  ├─sub1
│  └─sub2
├─b
│  ├─sub1
│  └─sub2
└─c
    ├─sub1
    └─sub2
...

Что мне делать, чтобы получить ожидаемый результат? Я попробовал следующий код, но он копирует только sub1, sub2 и sub3, я получил TypeError: copy() takes no arguments (1 given).

Благодаря @PrasPJ.

import os
import os.path
import shutil
import fnmatch

src_dir= ['C:/Users/User/Desktop/source/input']      # List of source dirs
included_subdirs = ['sub1', 'sub2']        # subdir to include from copy
dst_dir = 'C:/Users/User/Desktop/source/output'     # folder for the destination of the copy
for root_path in src_dir:
    #print(root_path)
    for root, dirs, files in os.walk(root_path): # recurse walking
        for dir in included_subdirs:
            #print(dir)
            if dir in dirs:
                source = os.path.join(root,dir)
                f_dst = source.replace(root_path, dst_dir)
                print (source, f_dst)
                for file in os.listdir(source):
                    print(file)
                    if file.endswith(".jpg") or file.endswith(".jpeg"):
                        shutil.copytree(source, f_dst)

Ссылка связана:

https://www.daniweb.com/programming/software-development/threads/356380/how-to-copy-folders-directories-using-python

Python Shutil Copytree: используйте функцию игнорирования, чтобы сохранить конкретный типы файлов

Как скопировать содержимое подкаталога в python


person ah bon    schedule 19.02.2019    source источник


Ответы (3)


Привет, вы пытаетесь использовать функцию копирования словаря, которая неверна

import os
import os.path
import shutil
import fnmatch

list_of_dirs_to_copy = ['C:/Users/User/Desktop/test/input'] # List of source dirs
included_subdirs = ['sub1', 'sub2']  # subdir to include from copy
dest_dir = 'C:/Users/User/Desktop/test/output'     # folder for the destination of the copy
for root_path in list_of_dirs_to_copy:
    print(root_path)
    for root, dirs, files in os.walk(root_path): # recurse walking
        for dir in included_subdirs:
            print(dir)
            if dir in dirs:
                source = os.path.join(root,dir)
                f_dest = source.replace(root_path, dest_dir)
                print source, f_dest 
                shutil.copytree(source,f_dest) 
person PrasPJ    schedule 19.02.2019
comment
Большое спасибо. Еще один вопрос: хочу ли я добавить еще одно условие для принятия решения о копировании sub1 и sub2 или нет, проверив, есть ли у них файлы внутри, заканчивающиеся на «jpg» или «jpeg» или нет? Что я должен делать? - person ah bon; 19.02.2019
comment
у вас есть только файлы в sub1 и sub2? - person PrasPJ; 19.02.2019

Вот обновление

for root_path in list_of_dirs_to_copy:
    for root, dirs, files in os.walk(root_path): # recurse walking
        path_to_copy = {}
        for dir in included_subdirs:
            if dir in dirs:
                source = os.path.join(root,dir)
                for f in os.listdir(source):
                    if os.path.isfile(os.path.join(source,f)) and (f.endswith("jpg") or f.endswith("jpeg")):
                        f_dest = source.replace(root_path, dest_dir)
                        path_to_copy.update({source: f_dest})
        if len(path_to_copy) == len(included_subdirs):
            for source, f_dest in path_to_copy.iteritems():
                shutil.copytree(source,f_dest)
person PrasPJ    schedule 21.02.2019

person    schedule
comment
Спасибо и извините, мне нужно задать еще один вопрос: что, если я скопирую подпапки a, b и c... только если в обоих sub1 и sub2 есть файлы изображений? - person ah bon; 21.02.2019