Sao chép nhiều tệp bằng Python


Câu trả lời:


139

Bạn có thể sử dụng os.listdir () để lấy các tệp trong thư mục nguồn, os.path.isfile () để xem chúng có phải là tệp thông thường hay không (bao gồm các liên kết tượng trưng trên hệ thống * nix) và shutil.copy để sao chép.

Đoạn mã sau chỉ sao chép các tệp thông thường từ thư mục nguồn vào thư mục đích (tôi cho rằng bạn không muốn bất kỳ thư mục con nào được sao chép).

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)

Cuối cùng phải là một cái gì đó như C: \ myfolder hoặc C: \ myfolder \ filename.ext?
Steve Byrne

4
@StevenByrne Có thể là một trong hai, tùy thuộc vào việc bạn có muốn đổi tên tệp hay không. Nếu không, sau đó destlà tên thư mục. shutil.copy(src, dst)"sao chép tệp src vào tệp hoặc thư mục dst .... Nếu dst chỉ định một thư mục, tệp sẽ được sao chép vào dst bằng cách sử dụng tên tệp cơ sở từ src."

30

Nếu bạn không muốn sao chép toàn bộ cây (với các thứ tự con, v.v.), hãy sử dụng hoặc glob.glob("path/to/dir/*.*")để lấy danh sách tất cả các tên tệp, lặp qua danh sách và sử dụng shutil.copyđể sao chép từng tệp.

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

2
Lưu ý: Bạn có thể phải kiểm tra kết quả toàn cầu bằng os.path.isfile () để chắc chắn rằng chúng là tên tệp. Xem thêm câu trả lời của GreenMatt. Trong khi global chỉ trả về tên tệp như os.listdir, nó vẫn trả về tên thư mục. Các ' . 'có thể là đủ, miễn là bạn không có tên tệp không có đuôi hoặc dấu chấm trong tên thư mục.
Steven

Điều này không sao chép các thứ tự con
citynorman


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
Có thể hữu ích khi đưa ra lời giải thích bằng lời về mã của bạn
calico_

1
Tôi nghĩ rằng bạn có nghĩa là ghi đè , không ghi đè
Mohammad ElNesr

Konstantin câu trả lời tuyệt vời !! đã giúp tôi rất nhiều. Tuy nhiên, một gợi ý: sử dụng os.sep thay vì '/' (vì vậy nó hoạt động trên hệ điều hành không phải Linux)
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

Đây là một ví dụ khác về hàm sao chép đệ quy cho phép bạn sao chép nội dung của thư mục (bao gồm cả các thư mục con) một tệp tại một thời điểm, mà tôi đã sử dụng để giải quyết vấn đề này.

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)

BIÊN TẬP: Nếu bạn có thể, chắc chắn chỉ cần sử dụng shutil.copytree(src, dest). Tuy nhiên, điều này yêu cầu rằng thư mục đích chưa tồn tại. Nếu bạn cần sao chép tệp vào một thư mục hiện có, phương pháp trên hoạt động tốt!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.