Копировать папки и подпапки, но только первые файлы в подпапках с python - PullRequest
0 голосов
/ 13 февраля 2020

У меня есть файловая структура, содержащая папки, подпапки, подпапки. Также только самые последние подпапки содержат файлы. Я хотел бы скопировать файловую структуру, при этом копируя не все файлы, а только первый файл (или только один файл) из каждой подпапки. Я заметил, что shutil.copytree(src, dst) может сделать что-то подобное, но я не знаю, как ограничить это копированием только первого файла из подпапок. Спасибо за совет о том, как выполнить sh это!

Моя файловая структура:

folder1
  subfolder11
    subsubfolder111
      file1
      file2
      file3...
folder2
  sulfolder21
    file1
    file2
    file3...

Желаемая структура:

folder1
  subfolder11
    subsubfolder111
      file1
folder2
  sulfolder21
    file1

Ответы [ 2 ]

1 голос
/ 13 февраля 2020

Я не знаю, можете ли вы настроить такое большое количество copytree, но с помощью os.walk и разбора папок вы можете сделать это, вот пример:

import os
import shutil

p1 = r"C:\src_dir"
p2 = r"C:\target_dir"

for path, folders, files in os.walk(p1):

    if not files: continue

    src = os.path.join(path, files[0])
    dst_path = path.replace(p1, '') + os.sep
    dst_folder = p2 + dst_path

    # create the target dir if doesn't exist
    if not os.path.exists(dst_folder):
        os.makedirs(dst_folder)

    # create dst file with only the first file
    dst = p2 + dst_path + files[0]

    # copy the file
    shutil.copy2(src, dst)
0 голосов
/ 13 февраля 2020

На основании ответа ГийомаЖ можно обобщить копирование в N файлов:

# limit of files to copy
N=3

for path, folders, files in os.walk(p1):

    # you might want to sort files first before executing the below
    for file_ in files[:N]:
    # if not files: continue

        src = os.path.join(path, file_)
        dst_path = path.replace(p1, '') + os.sep
        dst_folder = p2 + dst_path

        # create the target dir if doesn't exist
        if not os.path.exists(dst_folder):
            os.makedirs(dst_folder)

        # create dst file with only the first file
        dst = p2 + dst_path + file_

        # copy the file
        shutil.copy2(src, dst)
...