Python - Move and overwrite files and folders

后端 未结 6 1959
情话喂你
情话喂你 2021-01-30 06:27

I have a directory, \'Dst Directory\', which has files and folders in it and I have \'src Directory\' which also has files and folders in it. What I want to do is move the conte

相关标签:
6条回答
  • 2021-01-30 06:46

    Have a look at: os.remove to remove existing files.

    0 讨论(0)
  • 2021-01-30 06:54

    Since none of the above worked for me, so I wrote my own recursive function. Call Function copyTree(dir1, dir2) to merge directories. Run on multi-platforms Linux and Windows.

    def forceMergeFlatDir(srcDir, dstDir):
        if not os.path.exists(dstDir):
            os.makedirs(dstDir)
        for item in os.listdir(srcDir):
            srcFile = os.path.join(srcDir, item)
            dstFile = os.path.join(dstDir, item)
            forceCopyFile(srcFile, dstFile)
    
    def forceCopyFile (sfile, dfile):
        if os.path.isfile(sfile):
            shutil.copy2(sfile, dfile)
    
    def isAFlatDir(sDir):
        for item in os.listdir(sDir):
            sItem = os.path.join(sDir, item)
            if os.path.isdir(sItem):
                return False
        return True
    
    
    def copyTree(src, dst):
        for item in os.listdir(src):
            s = os.path.join(src, item)
            d = os.path.join(dst, item)
            if os.path.isfile(s):
                if not os.path.exists(dst):
                    os.makedirs(dst)
                forceCopyFile(s,d)
            if os.path.isdir(s):
                isRecursive = not isAFlatDir(s)
                if isRecursive:
                    copyTree(s, d)
                else:
                    forceMergeFlatDir(s, d)
    
    0 讨论(0)
  • 2021-01-30 06:54

    I had a similar problem. I wanted to move files and folder structures and overwrite existing files, but not delete anything which is in the destination folder structure.

    I solved it by using os.walk(), recursively calling my function and using shutil.move() on files which I wanted to overwrite and folders which did not exist.

    It works like shutil.move(), but with the benefit that existing files are only overwritten, but not deleted.

    import os
    import shutil
    
    def moverecursively(source_folder, destination_folder):
        basename = os.path.basename(source_folder)
        dest_dir = os.path.join(destination_folder, basename)
        if not os.path.exists(dest_dir):
            shutil.move(source_folder, destination_folder)
        else:
            dst_path = os.path.join(destination_folder, basename)
            for root, dirs, files in os.walk(source_folder):
                for item in files:
                    src_path = os.path.join(root, item)
                    if os.path.exists(dst_file):
                        os.remove(dst_file)
                    shutil.move(src_path, dst_path)
                for item in dirs:
                    src_path = os.path.join(root, item)
                    moverecursively(src_path, dst_path)
    
    0 讨论(0)
  • 2021-01-30 07:01

    Use copy() instead, which is willing to overwrite destination files. If you then want the first tree to go away, just rmtree() it separately once you are done iterating over it.

    http://docs.python.org/library/shutil.html#shutil.copy

    http://docs.python.org/library/shutil.html#shutil.rmtree

    Update:

    Do an os.walk() over the source tree. For each directory, check if it exists on the destination side, and os.makedirs() it if it is missing. For each file, simply shutil.copy() and the file will be created or overwritten, whichever is appropriate.

    0 讨论(0)
  • 2021-01-30 07:03

    If you also need to overwrite files with read only flag use this:

    def copyDirTree(root_src_dir,root_dst_dir):
    """
    Copy directory tree. Overwrites also read only files.
    :param root_src_dir: source directory
    :param root_dst_dir:  destination directory
    """
    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):
                try:
                    os.remove(dst_file)
                except PermissionError as exc:
                    os.chmod(dst_file, stat.S_IWUSR)
                    os.remove(dst_file)
    
            shutil.copy(src_file, dst_dir)
    
    0 讨论(0)
  • 2021-01-30 07:09

    This will go through the source directory, create any directories that do not already exist in destination directory, and move files from source to the destination directory:

    import os
    import shutil
    
    root_src_dir = 'Src Directory\\'
    root_dst_dir = 'Dst Directory\\'
    
    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):
                # in case of the src and dst are the same file
                if os.path.samefile(src_file, dst_file):
                    continue
                os.remove(dst_file)
            shutil.move(src_file, dst_dir)
    

    Any pre-existing files will be removed first (via os.remove) before being replace by the corresponding source file. Any files or directories that already exist in the destination but not in the source will remain untouched.

    0 讨论(0)
提交回复
热议问题