Python에서 여러 파일 복사


답변:


139

os.listdir () 을 사용 하여 소스 디렉토리에서 파일을 가져 오고 os.path.isfile () 을 사용하여 파일이 일반 파일 (* nix 시스템의 심볼릭 링크 포함)인지 확인하고 shutil.copy 를 사용하여 복사를 수행 할 수 있습니다.

다음 코드는 원본 디렉터리의 일반 파일 만 대상 디렉터리로 복사합니다 (하위 디렉터리를 복사하지 않으려 고 가정합니다).

import os
import shutil
src_files = os.listdir(src)
for file_name in src_files:
    full_file_name = os.path.join(src, file_name)
    if os.path.isfile(full_file_name):
        shutil.copy(full_file_name, dest)

dest는 C : \ myfolder 또는 C : \ myfolder \ filename.ext와 같은 형식이어야합니까?
Steve Byrne

4
@StevenByrne 파일 이름도 변경하려는 경우에 따라 둘 중 하나 일 수 있습니다. 그렇지 않은 경우 dest디렉토리 이름입니다. shutil.copy(src, dst)"파일 src를 파일 또는 디렉토리 dst로 복사합니다 .... dst가 디렉토리를 지정하면 파일은 src의 기본 파일 이름을 사용하여 dst로 복사됩니다."

30

전체 트리 (하위 디렉토리 등)를 복사하지 않으려면 또는를 사용 glob.glob("path/to/dir/*.*")하여 모든 파일 이름 목록을 가져 오고 목록을 반복하여 shutil.copy각 파일을 복사 하는 데 사용 하십시오.

for filename in glob.glob(os.path.join(source_dir, '*.*')):
    shutil.copy(filename, dest_dir)

2
참고 : os.path.isfile ()로 glob 결과를 확인하여 파일 이름인지 확인해야 할 수 있습니다. GreenMatt의 답변을 참조하십시오. glob은 os.listdir과 같은 파일 이름 만 반환하지만 여전히 디렉토리 이름도 반환합니다. ' . 확장명이없는 파일 이름이나 디렉토리 이름에 점이 없으면 패턴으로 충분할 수 있습니다.
Steven

이것은 subdirs를 복사하지 않습니다
citynorman

12

Python 문서 , 특히 copytree 명령 에서 shutil을 살펴보십시오 .


3
좋은 말이지 만 제 경우와 같이 어떤 이유로 디렉토리가 이미 존재하는 경우 옵션이 아닐 수 있습니다.
Sven

5
def recursive_copy_files(source_path, destination_path, override=False):
    """
    Recursive copies files from source  to destination directory.
    :param source_path: source directory
    :param destination_path: destination directory
    :param override if True all files will be overridden otherwise skip if file exist
    :return: count of copied files
    """
    files_count = 0
    if not os.path.exists(destination_path):
        os.mkdir(destination_path)
    items = glob.glob(source_path + '/*')
    for item in items:
        if os.path.isdir(item):
            path = os.path.join(destination_path, item.split('/')[-1])
            files_count += recursive_copy_files(source_path=item, destination_path=path, override=override)
        else:
            file = os.path.join(destination_path, item.split('/')[-1])
            if not os.path.exists(file) or override:
                shutil.copyfile(item, file)
                files_count += 1
    return files_count

1
그것은 코드의 구두 설명을 제공하는 데 도움이 수
calico_

1
난 당신 말은 생각 덮어 쓰기 하지 오버라이드 (override)
모하마드 ElNesr을

Konstantin 훌륭한 답변 !! 나를 많이 도왔다. 하지만 한 가지 제안 : '/'대신 os.sep를 사용하는 것 (따라서 비 리눅스 OS에서 작동 함)
Ari

4
import os
import shutil
os.chdir('C:\\') #Make sure you add your source and destination path below

dir_src = ("C:\\foooo\\")
dir_dst = ("C:\\toooo\\")

for filename in os.listdir(dir_src):
    if filename.endswith('.txt'):
        shutil.copy( dir_src + filename, dir_dst)
    print(filename)

3

다음은이 문제를 해결하는 데 사용한 디렉토리 (하위 디렉토리 포함)의 내용을 한 번에 하나씩 복사 할 수있는 재귀 복사 기능의 또 다른 예입니다.

import os
import shutil

def recursive_copy(src, dest):
    """
    Copy each file from src dir to dest dir, including sub-directories.
    """
    for item in os.listdir(src):
        file_path = os.path.join(src, item)

        # if item is a file, copy it
        if os.path.isfile(file_path):
            shutil.copy(file_path, dest)

        # else if item is a folder, recurse 
        elif os.path.isdir(file_path):
            new_dest = os.path.join(dest, item)
            os.mkdir(new_dest)
            recursive_copy(file_path, new_dest)

편집 : 할 수 있다면 확실히 shutil.copytree(src, dest). 그래도 대상 폴더가 존재하지 않아야합니다. 기존 폴더에 파일을 복사해야하는 경우 위의 방법이 잘 작동합니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.