Python’da hazır gelen shutil(shell utilities) modülü; dosyaların ve dizinlerin kopyalanması, sıkıştırılması ve silinmesi gibi işlemleri üstlenmektedir.

Dosyaları Kopyalamak

Dosyaları bir konumdan bir başka konuma taşımak için shutil modülünün copy() fonksiyonu kullanılır. Örneklerimizde kullanılmak üzere aşağıdaki dosya ve klasör yapısını çalışma klasörümüz içinde oluşturalım;

├── main.py
├── demetler/
|   ├── bilgi.txt
|   └── demet1.py
|   ├── demet2.py
|   └── veri.json
├── listeler/
|   ├── bilgi.txt
|   └── liste1.py
|   ├── liste2.py
|   ├── liste3.py
|   ├── liste4.py
|   └── liste-verisi.json
|
├── demet.py
├── ornek1.py
├── ornek2.py
├── veri1.json
├── veri2.json

 

Demetler klasörü altında yer alan demet1.py dosyasını listeler klasörü altına kopyalayalım;

import shutil

shutil.copy("demetler/demet1.py","listeler")

Eğer, belirttiğiniz adres bir klasör ise, kopyalamak istediğiniz dosya belirttiğiniz klasör içinde oluşturulacaktır.  Ancak dikkat etmeniz gereken nokta şudur ki;

Eğer kopyalanacak hedef klasör yerine bir dosya belirtirseniz, bu dosyanın içeriği kopyalamak istediğiniz kaynak dosyanın içeriği ile değiştirilir. Yani içeriği kopyalamış olursunuz. 

Yani asıl amacınız bir doyayı bir başka klasör içine kopyalamak ise, hedef adresin gerçekten klasör olduğunu tespit etmek için önceki konularda öğrendiğimiz bilginizi kullanarak bir kontrol kodu yazmalısınız.

Ancak bu yan etkinin de kullanışlı bir yönü vardır; eğer bir dosyanın içeriğini farklı isimdeki bir başka dosyaya kopyalamak ve içeriğini eklemek değil, tamamen değiştirmek istiyorsanız hedef olarak bir dosya yolu belirterek bu fonksiyonu kullanabilirsiniz.

copy() fonksiyonu sadece dosya içeriğini ve yetkilerini taşır. Ancak dosyanın oluşturulma ve düzenleme tarihi gibi bilgileri kopyalanmaz. Eğer tüm meta bilgilerinin de kopyalanmasını istiyorsanız copy2() fonksiyonunu kullanmalısınız.

 

Klasörleri Kopyalamak

copy() fonksiyonu sadece tek bir dosyanın kopyalanması işlemini gerçekleştirir. Eğer birden çok dosyanın kopyalanmasını istiyorsanız ya mevcut bilginiz ile bir döngü kullanabilirsiniz ya da tüm kalsörü içindekilerle birlikte kopyalamayı deneyebilirsiniz. bunun için de copytree() fonksiyonu kullanılmaktadır.

Ancak bu fonksiyonda hedef klasör mevcut olmamalıdır. Yani hedef olarak mevcut bir klasörün altına yeni bir klasör ismi vererek kopyalama yapmalısınız;

import shutil

shutil.copytree("demetler", "listeler/demetler-yedek")

Bu yöntem ile klasörlerin yedeklemesini yapmak kolaydır.

Eğer hedef adreste aynı isimde bir klasör var ise, kodunuzun hata vermemesi için dirs_exist_ok=True parametresini ekleyebilirsiniz. Ya da mevcut bilginiz ile bunun kontrolünü gerçekleştirecek bir kod ekleyebilirsiniz.

 

Dosya ve Klasörleri Taşıma

Tahmin edeceğiniz üzere Python’da dosya ve klasör taşıma işlemleri için kullanılan fonksiyon move() fonksiyonudur. Bu fonksiyon belirttiğiniz hedef klasör altına  dosya ya da klasörünüzü taşır, ama belirttiğiniz dosya ya da klasör zaten mevcutsa taşıdığınız dosya ve klasörün içeriğini ekler.

# Dosya taşımak. Demetler klasörü altındaki veri.json dosyasını listeler klasörünün altına taşır.
shutil.move("demetler/veri.json","listeler")

# Klasör taşımak. Demetler klasörünü listeler klasörünün altına taşır
shutil.move("demetler","listeler")

 

Dosya ve Klasörleri Yeniden İsimlendirmek

Yine tahmin edeceksinizdir ki dosya ve klasörleri yeniden adlandırmak için rename() fonksiyonu kullanılmaktadır. ancak bu fonksiyon shutil modülü içinde değil os modülü içindedir;

import os

# Dosyayı yeniden adlandırmak
os.rename("ornek1.py","kume-ornek.py")

# Klasörü yeniden adlandırmak
os.rename("listeler/demetler-yedek","yedekler-dizini")

 

Burada yer alan örnek kodları şu adreste görebilirsiniz;

https://repl.it/@ObenSEVEN/dosya-dizin-kopyalama