Salin banyak file dengan Python

Jawaban:

139

Anda dapat menggunakan os.listdir () untuk mendapatkan file di direktori sumber, os.path.isfile () untuk melihat apakah itu file biasa (termasuk tautan simbolik pada sistem * nix), dan shutil.copy untuk melakukan penyalinan.

Kode berikut hanya menyalin file biasa dari direktori sumber ke direktori tujuan (saya berasumsi Anda tidak ingin sub-direktori disalin).

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)
GreenMatt
sumber
Haruskah dest menjadi sesuatu seperti C: \ myfolder atau C: \ myfolder \ filename.ext?
Steve Byrne
4
@StevenByrne Bisa jadi, tergantung apakah Anda juga ingin mengganti nama file. Jika tidak, maka destnama direktorinya. shutil.copy(src, dst)"menyalin file src ke file atau direktori dst .... Jika dst menentukan direktori, file tersebut akan disalin ke dst menggunakan nama file dasar dari src."
30

Jika Anda tidak ingin menyalin seluruh pohon (dengan subdirektori dll), gunakan atau glob.glob("path/to/dir/*.*")untuk mendapatkan daftar semua nama file, putar ulang daftar dan gunakan shutil.copyuntuk menyalin setiap file.

for filename in glob.glob(os.path.join(source_dir, '*.*')):
    shutil.copy(filename, dest_dir)
Steven
sumber
2
Catatan: Anda mungkin harus memeriksa hasil glob dengan os.path.isfile () untuk memastikan itu adalah nama file. Lihat juga jawaban GreenMatt. Meskipun glob hanya mengembalikan nama file seperti os.listdir, ia juga tetap mengembalikan nama direktori. Itu ' . 'pola mungkin cukup, selama Anda tidak memiliki nama file tanpa ekstensi, atau titik di nama direktori.
Steven
Ini tidak menyalin subdirektori
citynorman
12

Lihat shutil di dokumen Python , khususnya perintah copytree .

Doon
sumber
3
Komentar yang bagus, tetapi ini mungkin bukan pilihan jika direktori sudah ada karena alasan tertentu seperti dalam kasus saya.
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
Константин Бушко
sumber
1
Dapat membantu untuk memberikan penjelasan verbal tentang kode Anda
calico_
1
Saya pikir maksud Anda timpa , bukan timpa
Mohammad ElNesr
Konstantin jawaban yang bagus !! banyak membantu saya. Namun satu saran: untuk menggunakan os.sep daripada '/' (sehingga berfungsi pada OS non-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)
Isaac Ewhuiknebueze
sumber
3

Berikut adalah contoh lain dari fungsi salin rekursif yang memungkinkan Anda menyalin konten direktori (termasuk sub-direktori) satu file pada satu waktu, yang saya gunakan untuk mengatasi masalah ini.

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)

EDIT: Jika bisa, pasti gunakan saja shutil.copytree(src, dest). Ini mengharuskan folder tujuan tersebut belum ada. Jika Anda perlu menyalin file ke folder yang ada, metode di atas berfungsi dengan baik!

Dustin Michels
sumber