Program Tip

Python-파일 및 폴더 이동 및 덮어 쓰기

programtip 2020. 11. 24. 19:27
반응형

Python-파일 및 폴더 이동 및 덮어 쓰기


파일과 폴더가있는 'Dst Directory'라는 디렉토리가 있고 그 안에 파일과 폴더가있는 'src Directory'도 있습니다. 내가하고 싶은 것은 'src Directory'의 내용을 'Dst Directory'로 옮기고 동일한 이름을 가진 파일을 덮어 쓰는 것입니다. 따라서 예를 들어 'Src Directory \ file.txt'를 'Dst Directory \'로 이동하고 기존 file.txt를 덮어 써야합니다. 일부 폴더에도 동일하게 적용되며 폴더를 이동하고 'dst 디렉토리'의 동일한 폴더에 내용을 병합합니다.

저는 현재 shutil.move를 사용하여 src의 내용을 dst로 이동하고 있지만 파일이 이미 존재하고 폴더를 병합하지 않는 경우에는 수행하지 않습니다. 기존 폴더 안에 폴더를 넣습니다.

업데이트 : 좀 더 명확하게하기 위해; 내가하는 일은 아카이브를 Dst 디렉토리로 압축을 푼 다음 Src 디렉토리의 내용을 그곳으로 옮기고 다시 압축하여 zip 아카이브의 파일을 효과적으로 업데이트하는 것입니다. 이것은 새 파일이나 파일의 새 버전 등을 추가하기 위해 반복되므로 덮어 쓰고 병합해야합니다.

해결됨 : distutils.dir_util.copy_tree (src, dst)를 사용하여 문제를 해결했습니다. 이것은 src 디렉토리의 폴더와 파일을 dst 디렉토리로 복사하고 필요한 곳에 덮어 쓰기 / 병합합니다. 어떤 사람들에게 도움이되기를 바랍니다!

이해가 되길 바랍니다, 감사합니다!


copy()대신 사용하면 대상 파일을 덮어 씁니다. 그런 다음 첫 번째 트리를 rmtree()사라지게하려면 반복 작업을 마친 후 별도로 트리를 제거 하십시오.

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

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

최신 정보:

를 수행 os.walk()소스 트리입니다. 각 디렉토리에 대해 대상 측에 존재 os.makedirs()하는지, 누락되었는지 확인하십시오. 각 파일에 대해 간단 shutil.copy()하고 파일이 생성되거나 덮어 쓰기됩니다.


이것은 소스 디렉토리를 거쳐 대상 디렉토리에 아직 존재하지 않는 디렉토리를 만들고 소스에서 대상 디렉토리로 파일을 이동합니다.

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)

기존 파일은 os.remove해당 소스 파일로 교체되기 전에 먼저 (를 통해 ) 제거 됩니다. 대상에는 이미 존재하지만 소스에는없는 파일이나 디렉토리는 그대로 유지됩니다.


위의 어느 것도 나를 위해 일하지 않았기 때문에 내 자신의 재귀 함수를 작성했습니다. 디렉터리를 병합하려면 copyTree (dir1, dir2) 함수를 호출합니다. 다중 플랫폼 Linux 및 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)

읽기 전용 플래그로 파일을 덮어 쓰려면 다음을 사용하십시오.

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)

보세요 : os.remove기존 파일을 제거합니다.


비슷한 문제가있었습니다. 파일 및 폴더 구조를 이동하고 기존 파일을 덮어 쓰고 싶었지만 대상 폴더 구조에있는 것은 삭제하지 않았습니다.

을 사용하여 os.walk()내 함수를 재귀 적으로 호출 shutil.move()하고 덮어 쓰고 싶은 파일과 존재하지 않는 폴더를 사용하여 해결했습니다 .

과 같이 작동 shutil.move()하지만 기존 파일은 덮어 쓰기 만하고 삭제되지는 않는다는 이점이 있습니다.

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)

참고URL : https://stackoverflow.com/questions/7419665/python-move-and-overwrite-files-and-folders

반응형