Заменить несколько файлов и папок в python - PullRequest
0 голосов
/ 10 июля 2020

Как я мог go это сделать? У меня есть большая папка с множеством подпапок и файлов, я хочу заменить несколько c папок и файлов на другие папки и файлы, хранящиеся где-то еще, которые содержат ту же файловую структуру.

BigFolder
|
|--Folder 1
|--Folder 2
|--Folder 3
|--Folder 4
|--File 1
|--File 2


"Backup 1"
|
|--Folder 1
|--Folder 3
|--File 2

"Backup 2"
|
|--Folder 1
|--Folder 3
|--File 2

"Backup 3"
|
|--Folder 1
|--Folder 3
|--File 2

Я заключил «резервное копирование» в кавычки, потому что это не настоящая цель этого, но, например, для целей это работает. Таким образом, я должен быть в состоянии захватить определенное c содержимое большой папки и поместить его в одну из резервных копий, затем взять другую резервную копию, захватить ее содержимое и перетащить в большую папку, в основном меняя их местами. Как я мог этого добиться? Я пробовал с shutil.copytree, но это вызывает ошибку, потому что папка, в которую я копирую, уже существует, действительно глупое ограничение. Я также пробовал использовать copytree distutils, но пока он работает, он не копирует нужные мне папки, а только их содержимое, поэтому не сохраняет файловую структуру.

import shutil

bigFolder = "/home/user/Big Folder"

def swapFiles(newFolder, prevFolder):
    path = os.path
    #Copy from big folder to the previous backup
    shutil.copytree(path.join(bigFolder, "Folder 1"), prevFolder)
    shutil.copytree(path.join(bigFolder, "Folder 3"), prevFolder)
    shutil.copy(path.join(bigFolder, "File 2"), prevFolder)

    #Copy from new folder to big folder
    shutil.copytree(newFolder, bigFolder)

Это не работать, потому что папка назначения уже существует, она работает только с несуществующей папкой. С distutils:

from distutils.dir_util import copy_tree
import shutil

bigFolder = "/home/user/Big Folder"

def swapFiles(newFolder, prevFolder):
    path = os.path
    #Copy from big folder to the previous backup
    copy_tree(path.join(bigFolder, "Folder 1"), prevFolder)
    copy_tree(path.join(bigFolder, "Folder 3"), prevFolder)
    shutil.copy(path.join(bigFolder, "File 2"), prevFolder) #shutil is fine here

    #Copy from new folder to big folder
    copy_tree(newFolder, bigFolder)

Это не работает, потому что копирует содержимое папок, а не саму папку, поэтому я не сохраняю файловую структуру.

Кстати , в середине двух процессов копирования я должен удалить файлы и папки, чтобы избежать слияния с файлами newFolder, но это не имеет отношения к вопросу.

Ответы [ 2 ]

0 голосов
/ 11 июля 2020

Я нашел решение, оказалось, что глупое ограничение shutil, заключающееся в возможности копировать файлы только в папки, которые не существуют, в конце концов было полезно, но мне также нужно было использовать функцию copy_tree из distutils, к счастью, они оба являются stdlib. Сначала создайте список со всеми файлами и папками, которые вы хотите скопировать, следующим образом:

filesToCopy = ["File 2", "Folder 1", "Folder 3"]

Затем нам нужно создать пару циклов для каждого из этапов.

import shutil, os
from distutils.dir_util import copy_tree

def swapFiles(newDir, prevDir):
    bigFolder = "Big Folder/Path"

    #Copy from the big folder to the prevDir
    for file in filesToCopy:
    #Check if what you're about to copy is a directory
    if os.path.isdir(os.path.join(bigFolder, file)):
        copy_tree(os.path.join(bigFolder, file), os.path.join(prevDir, file))
    else:
        #If its a file, do a simple copy
        shutil.copy(os.path.join(bigFolder, file), os.path.join(prevDir, file))

    #Remove the copies folders from the big folder
    for file in filesToCopy:
        if os.path.isdir(os.path.join(bigFolder, file)):
            shutil.rmtree(os.path.join(bigFolder, file))
        else:
            os.remove(os.path.join(bigFolder, file))

    #Copy over files from newDir to bigFolder
    for file in filesToCopy:
        if os.path.isdir(os.path.join(newDir, file)):
            #I use shutil's copytree here because I want it to create the folders I deleted in the previous step
            shutil.copytree(os.path.join(newDir, file), os.path.join(bigFolder, file))
        else:
            shutil.copy(os.path.join(newDir, file), os.path.join(bigFolder, file))

При этом сохраняется файловая структура, и очень легко указать, какие файлы и папки вы хотите поменять местами.

0 голосов
/ 10 июля 2020
#recursively merge two folders including subfolders
def mergefolders(root_src_dir, root_dst_dir):
    for src_dir, dirs, files in os.walk(root_src_dir):
        dst_dir = src_dir.replace(root_src_dir, root_dst_dir, 1)
        if not os.path.exists(dst_dir):
            os.makedirs(dst_dir)
        for file_ in files:
            src_file = os.path.join(src_dir, file_)
            dst_file = os.path.join(dst_dir, file_)
            if os.path.exists(dst_file):
                os.remove(dst_file)
            shutil.copy(src_file, dst_dir)

источник: https://lukelogbook.tech/2018/01/25/merging-two-folders-in-python/

...