Python'da birden çok dosyayı kopyalayın


Yanıtlar:


141

Sen kullanabilirsiniz () os.listdir kaynak dizinindeki dosyaları almak için, os.path.isfile () onlar (* Nix sistemleri üzerinde simgesel bağlantılar dahil) düzenli dosyalar olup olmadığını görmek ve için shutil.copy kopyalama yapmak.

Aşağıdaki kod, kaynak dizinden yalnızca normal dosyaları hedef dizine kopyalar (herhangi bir alt dizinin kopyalanmasını istemediğinizi varsayıyorum).

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: \ klasörüm veya C: \ klasörüm \ dosyaadı.ext gibi bir şey mi olmalı?
Steve Byrne

4
@StevenByrne Dosyayı yeniden adlandırmak isteyip istemediğinize bağlı olarak herhangi biri olabilir. Değilse dest, dizin adıdır. shutil.copy(src, dst)"src dosyasını dst dosyasına veya dizinine kopyalar .... dst bir dizini belirtirse, dosya src'deki temel dosya adı kullanılarak dst'ye kopyalanacaktır."

Küçük gelişme: src_files'ı bırakın ve yapınfor fn in os.listdir(src)
Timo

32

Tüm ağacı (alt dizinlerle vb.) Kopyalamak istemiyorsanız, veya tuşunu glob.glob("path/to/dir/*.*")kullanarak tüm dosya adlarının bir listesini alın, liste üzerinde döngü yapın ve shutil.copyher dosyayı kopyalamak için kullanın .

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

2
Not: Dosya adları olduklarından emin olmak için glob sonuçlarını os.path.isfile () ile kontrol etmeniz gerekebilir. GreenMatt'ın cevabına da bakın. Glob yalnızca os.listdir gibi dosya adını döndürürken, yine de dizin adlarını döndürür. ' . Uzantısız dosya adlarınız veya dizin adlarında noktalar olmadığı sürece 'desen yeterli olabilir.
Steven

Bu alt
dizinleri

14

Bak Python docs shutil , özellikle copytree komutu.

Hedef dizin zaten mevcutsa şunu deneyin:

shutil.copytree(source, destination, dirs_exist_ok=True)

3
Güzel bir açıklama, ancak benim durumumda olduğu gibi dizin zaten herhangi bir nedenle mevcutsa bu bir seçenek olmayabilir.
Sven

@Sven Bunun için deneyin dirs_exist_ok=Trueseçeneği.
Emadpres

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
Kodunuzun sözlü bir açıklamasını
yapmanıza

1
Demek istediniz üzerine yazma değil, geçersiz
Muhammed ElNesr

Konstantin harika cevap !! bana çok yardım etti. Yine de bir öneri: '/' yerine os.sep kullanmak (yani linux olmayan işletim sistemlerinde çalışır)
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

Burada, dizinin içeriğini (alt dizinler dahil) bir seferde bir dosya kopyalamanıza izin veren ve bu sorunu çözmek için kullandığım özyinelemeli kopyalama işlevinin başka bir örneği var.

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)

DÜZENLEME: Yapabiliyorsanız, kesinlikle kullanın shutil.copytree(src, dest). Bu, hedef klasörün zaten mevcut olmamasını gerektirir. Dosyaları mevcut bir klasöre kopyalamanız gerekiyorsa, yukarıdaki yöntem işe yarar!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.