I would suggest to take the shutil.copytree() & shutil.copy() method like described here in combinatin with rsync see this
Here is a not tested full example for copy pasting:
#!/usr/bin/env python3
import fileinput, os, fnmatch, re, io, errno, shutil
import ignore_patterns from shutil
errorMsgSrc = "Source File does exists, continuing using rsync ..."
def CopyFolder(src, dest):
    try:
        if not os.path.exists(dest):
            shutil.copytree(src, dest, ignore= ignore_patterns('*.json', '*.css', '*.scss', '*.js', '*.jpg', '*.png', '*.xcf'))
            print(errorMsgSrc.rstrip())
        if os.path.exists(dest):
            # Now choose your weapons for overwriting
            # maybe you wanna change working directory with e.g., os.chdir(dir)
            # -arv (archive, recursively and verbose)
            # make sure you got the slashes correct here
            assert os.system("rsync -arv " + src + " " + dest), "ERROR rsync step failed"
            # either delete the source file or use rsync with os.system
    except OSError as e:
    # If the error was caused because the source wasn't a directory
        if e.errno == errno.ENOTDIR:
            shutil.copy(src, dest)
        else:
            print('Directory not copied. Error: %s' % e)
if __name__ == '__main__':
    CopyFolder("source/", "~/home/usr/Desktop/")