Tartışma

Python ile RAR Dosyası Yönetimi

Başlatan NeonSpectre · 09 Tem 2026 10:51 · 15 Görüntülenme · 0 Yanıtlar
Konuyu Açan #0
Python ile RAR Dosyası Yönetimi

Merhaba arkadaşlar, bugün sizlerle Python'ın sıkıştırılmış dosya yönetimi kabiliyetlerine, özellikle de RAR dosyalarına odaklanacağız. ZIP'in aksine, RAR formatı kapalı kaynak kodlu bir yapıya sahip olduğundan, Python'da doğrudan RAR işlemleri yapmak ilk bakışta biraz zorlayıcı görünebilir. Ama endişelenmeyin, bu durum aşılamaz değil. Pek çok projede, özellikle de eski arşivleri yönetirken veya belirli bir veri setini işlerken RAR dosyalarıyla karşılaşma ihtimalimiz yüksek. Bu yüzden, bu formatla etkili bir şekilde başa çıkabilmek, bence her yazılımcının bilmesi gereken bir yetenek. Hadi gelin, bu teknik detayın derinliklerine inelim...

RAR dosyaları, özellikle çok parçalı arşivler ve güçlü sıkıştırma oranları sayesinde hala oldukça yaygın kullanılıyor. Evet, ZIP daha evrensel ve açık kaynaklı, çoğu işletim sistemi tarafından doğal olarak destekleniyor, ancak RAR'ın sunduğu bazı avantajlar var ki, onu hala vazgeçilmez kılıyor. Örneğin, bozuk arşivlerin onarılması yeteneği veya daha iyi sıkıştırma performansı, bazı senaryolarda kritik olabiliyor. Bizim amacımız da, Python'ın esnekliğini kullanarak bu RAR arşivlerini programatik olarak yönetmek, içlerindeki verilere erişmek veya hatta yenilerini oluşturmak. Bu, özellikle otomasyon senaryolarında, büyük veri setlerini işlerken veya dosya transferi operasyonlarında işimize yarayacak.

Gerekli Kütüphaneler ve Kurulum

Python'da RAR dosyalarıyla çalışmak için doğrudan standart bir kütüphane bulunmuyor, bu yüzden harici bir pakete ihtiyacımız var: rarfile. Bu kütüphane, RAR dosyalarını okuma, listeleme ve ayıklama konusunda bize oldukça güçlü yetenekler sunuyor. Kurulumu da diğer Python paketleri gibi basit:

CODE
12
pip install rarfile


Ancak burada önemli bir nüans var: rarfile kütüphanesi, aslında arka planda sisteminizde kurulu olan unrar komut satırı aracını kullanır. Yani, Python kodunuzun RAR dosyalarını işleyebilmesi için, unrar aracının da sisteminizde yüklü ve PATH değişkeninde tanımlı olması gerekiyor. Linux ve macOS kullanıcıları genellikle paket yöneticileri aracılığıyla kolayca kurabilirler (örneğin, Debian/Ubuntu'da sudo apt-get install unrar veya macOS'ta brew install unrar). Windows kullanıcıları için ise, WinRAR'ın resmi sitesinden unrar.exe dosyasını indirip sistem PATH'inize eklemeniz veya rarfile kütüphanesine unrar aracının yolunu belirtmeniz gerekebilir. Bu adımı atlamamak, birçok "neden çalışmıyor?" sorusunun cevabı olabilir. Kurulum tamamlandığında, artık RAR dünyasına adım atmaya hazırız.

RAR Dosyası Açma ve İçeriğini Listeleme

Bir RAR dosyasının içeriğini görmek, çoğu zaman ilk yapmamız gereken şeydir. Hangi dosyaların olduğunu bilmeden neyi ayıklayacağımıza karar veremeyiz, değil mi? rarfile kütüphanesi, bu işlemi oldukça basit hale getiriyor. Tıpkı Python'ın zipfile kütüphanesindeki gibi, bir RAR dosyasını bir bağlam yöneticisi (with ifadesi) kullanarak açmak, kaynak yönetimini de kolaylaştırır.

Şöyle bir örnekle başlayalım: Diyelim ki my_archive.rar adında bir RAR dosyamız var ve içinde neler olduğunu merak ediyoruz.

CODE
1234567891011121314151617181920212223242526272829
import rarfile
import os

[b]RAR dosyasının yolu[/b]
rar_dosya_yolu = "my_archive.rar"

[b]Örnek bir RAR dosyası oluşturulmuş gibi düşünelim[/b]
[b]Gerçekte bu dosyanın var olması gerekiyor.[/b]
[b]Test için içerisine birkaç dosya atabilirsiniz.[/b]
[b]Örneğin, my_archive.rar içinde:[/b]
[b]- dosya1.txt[/b]
[b]- klasor_ici/dosya2.jpg[/b]

if not os.path.exists(rar_dosya_yolu):
    print(f"Hata: '{rar_dosya_yolu}' bulunamadı. Lütfen bir RAR dosyası oluşturun.")
else:
    try:
        with rarfile.RarFile(rar_dosya_yolu, 'r') as rf:
            print(f"'{rar_dosya_yolu}' içeriği:")
            for item in rf.infolist():
                print(f"  Ad: {item.filename}, Boyut: {item.file_size} bayt, Sıkıştırılmış Boyut: {item.compress_size} bayt")
                if item.isdir():
                    print("    (Bu bir klasör)")

    except rarfile.BadRarFile:
        print(f"Hata: '{rar_dosya_yolu}' geçerli bir RAR dosyası değil veya bozuk.")
    except Exception as e:
        print(f"Beklenmeyen bir hata oluştu: {e}")


Bu kod parçacığı, belirtilen RAR dosyasını okuma modunda açar ve içindeki her bir öğe (dosya veya klasör) için adını, orijinal boyutunu ve sıkıştırılmış boyutunu listeler. infolist() metodu, her bir öğe hakkında detaylı bilgi içeren RarInfo nesneleri döndürür. Bu bilgiler sayesinde, ayıklama işlemine geçmeden önce neyle uğraştığımızı tam olarak anlayabiliriz. Özellikle büyük arşivlerde, tüm içeriği ayıklamak yerine sadece belirli bir dosyayı arıyorsak, bu listeleyici fonksiyon çok işimize yarar.

RAR İçeriğini Ayıklama

RAR dosyasının içeriğini listeledik, şimdi sıra geldi bu içerikleri diskimize kaydetmeye. rarfile kütüphanesi, tüm arşivi veya sadece belirli dosyaları ayıklamak için oldukça esnek yöntemler sunuyor. Genellikle, bir RAR dosyasından belirli bir klasöre tüm dosyaları çıkarmak isteriz, değil mi? İşte bunun için extractall() metodu biçilmiş kaftan.

Önceki örnekten devam edelim, my_archive.rar dosyasındaki tüm içeriği cikartilan_dosyalar/ adlı bir klasöre ayıklayalım:

CODE
123456789101112131415161718192021222324252627282930313233
import rarfile
import os

rar_dosya_yolu = "my_archive.rar"
cikartma_klasoru = "cikartilan_dosyalar"

if not os.path.exists(rar_dosya_yolu):
    print(f"Hata: '{rar_dosya_yolu}' bulunamadı.")
else:
    try:
        # Çıkarma klasörünü oluştur, eğer yoksa
        os.makedirs(cikartma_klasoru, exist_ok=True)

        with rarfile.RarFile(rar_dosya_yolu, 'r') as rf:
            print(f"'{rar_dosya_yolu}' içeriği '{cikartma_klasoru}' klasörüne çıkarılıyor...")
            rf.extractall(path=cikartma_klasoru)
            print("Çıkarma işlemi tamamlandı.")

            # Çıkarılan dosyaları da listeleyebiliriz
            print(f"'{cikartma_klasoru}' klasörünün içeriği:")
            for root, dirs, files in os.walk(cikartma_klasoru):
                level = root.replace(cikartma_klasoru, '').count(os.sep)
                indent = ' ' * 4 * (level)
                print(f'{indent}{os.path.basename(root)}/')
                subindent = ' ' * 4 * (level + 1)
                for f in files:
                    print(f'{subindent}{f}')

    except rarfile.BadRarFile:
        print(f"Hata: '{rar_dosya_yolu}' geçerli bir RAR dosyası değil veya bozuk.")
    except Exception as e:
        print(f"Beklenmeyen bir hata oluştu: {e}")


Burada extractall(path=cikartma_klasoru) komutu, RAR arşivindeki tüm dosyaları ve klasörleri belirttiğimiz yola çıkarır. Eğer sadece belirli bir dosyayı ayıklamak istersek, extract() metodunu kullanabiliriz. Örneğin, my_archive.rar içindeki dosya1.txt dosyasını ayıklamak için:

CODE
123456789101112131415
[b]... (önceki koddan importlar ve dosya yolları) ...[/b]

try:
    with rarfile.RarFile(rar_dosya_yolu, 'r') as rf:
        # Sadece belirli bir dosyayı ayıklama
        target_file = "dosya1.txt" # Ayıklamak istediğimiz dosyanın RAR içindeki yolu
        if target_file in [f.filename for f in rf.infolist()]:
            print(f"'{target_file}' dosyası '{cikartma_klasoru}' klasörüne çıkarılıyor...")
            rf.extract(target_file, path=cikartma_klasoru)
            print(f"'{target_file}' başarıyla çıkarıldı.")
        else:
            print(f"Hata: '{target_file}' RAR arşivinde bulunamadı.")
except Exception as e:
    print(f"Hata: {e}")


Bu esneklik, özellikle büyük arşivlerden sadece ihtiyacımız olan parçaları çekip almak istediğimizde çok değerli hale geliyor. Düşünsenize, terabaytlarca veri içeren bir arşivden sadece birkaç log dosyasını çekmek... Tüm arşivi çıkarmak yerine bu yöntemle hem zamandan hem de disk alanından tasarruf edersiniz.

Şifreli RAR Dosyalarıyla Çalışma

Pek çok RAR arşivi, içeriğin güvenliğini sağlamak amacıyla şifrelenmiş olabilir. Python'ın rarfile kütüphanesi, şifreli arşivlerle başa çıkmak için de gerekli mekanizmaları sunuyor. Şifreli bir RAR dosyasını açmak veya içeriğini ayıklamak istediğimizde, doğru şifreyi sağlamamız gerekiyor. Aksi takdirde, kütüphane bir hata fırlatacaktır.

Şifreli bir RAR dosyasını açarken, RarFile sınıfının yapıcı metoduna pwd parametresi aracılığıyla şifreyi iletebiliriz. Bu şifre, bir bayt dizisi (bytes) olarak verilmelidir, yani string bir şifreyi .encode('utf-8') gibi bir yöntemle dönüştürmemiz gerekir.

Örnek olarak, sifreli_arsiv.rar adında, "benimsifrem" parolasıyla korunmuş bir RAR dosyamız olduğunu varsayalım:

CODE
1234567891011121314151617181920212223242526272829303132333435363738
import rarfile
import os

sifreli_rar_dosya_yolu = "sifreli_arsiv.rar"
cikartma_klasoru = "sifreli_cikartilan_dosyalar"
dogru_sifre = "benimsifrem" # RAR dosyanızın şifresi

if not os.path.exists(sifreli_rar_dosya_yolu):
    print(f"Hata: '{sifreli_rar_dosya_yolu}' bulunamadı.")
else:
    try:
        os.makedirs(cikartma_klasoru, exist_ok=True)

        # Şifreyi bayt dizisine dönüştürerek iletiyoruz
        with rarfile.RarFile(sifreli_rar_dosya_yolu, 'r', pwd=dogru_sifre.encode('utf-8')) as rf:
            print(f"'{sifreli_rar_dosya_yolu}' içeriği '{cikartma_klasoru}' klasörüne çıkarılıyor...")
            rf.extractall(path=cikartma_klasoru)
            print("Şifreli çıkarma işlemi tamamlandı.")

            # Çıkarılan dosyaları listeleme (önceki örnekteki gibi)
            print(f"'{cikartma_klasoru}' klasörünün içeriği:")
            for root, dirs, files in os.walk(cikartma_klasoru):
                level = root.replace(cikartma_klasoru, '').count(os.sep)
                indent = ' ' * 4 * (level)
                print(f'{indent}{os.path.basename(root)}/')
                subindent = ' ' * 4 * (level + 1)
                for f in files:
                    print(f'{subindent}{f}')

    except rarfile.BadRarFile:
        print(f"Hata: '{sifreli_rar_dosya_yolu}' geçerli bir RAR dosyası değil veya bozuk.")
    except rarfile.NotRarFile:
        print(f"Hata: '{sifreli_rar_dosya_yolu}' bir RAR dosyası değil.")
    except rarfile.RarCRCError:
        print(f"Hata: Şifre yanlış veya dosya bozuk. Lütfen şifreyi kontrol edin.")
    except Exception as e:
        print(f"Beklenmeyen bir hata oluştu: {e}")


Yanlış bir şifre verdiğinizde veya dosya bozuk olduğunda rarfile.RarCRCError gibi bir hata alacağınızı unutmayın. Bu, şifre denemeleri yaparken veya kullanıcıdan şifre alırken hata yönetimini doğru bir şekilde ele almanız gerektiği anlamına gelir. Şifrelerinizi kodunuzda doğrudan tutmak yerine, güvenli bir şekilde (örneğin ortam değişkenleri veya bir yapılandırma dosyası aracılığıyla) yönetmeyi düşünmelisiniz.

Yeni RAR Dosyası Oluşturma

Şimdi gelelim Python ile RAR dosyası oluşturma konusuna... Burada maalesef rarfile kütüphanesinin veya Python'ın standart kütüphanelerinin doğrudan bir RAR yazma yeteneği bulunmuyor. RAR formatının kapalı kaynak yapısı ve lisanslama durumu, bu tür bir entegrasyonu oldukça zorlaştırıyor. Çoğu Python kütüphanesi, unrar aracının okuma yeteneklerine dayanır, yazma yeteneklerine değil. Peki bu, Python ile RAR dosyası oluşturamayız demek mi? Hayır, ama dolaylı yollara başvurmamız gerekiyor.

En yaygın ve pratik yöntem, sisteminizde kurulu olan rar (veya WinRAR) komut satırı aracını Python'dan subprocess modülü aracılığıyla çağırmaktır. Bu, Python betiğinizin, harici bir programı sanki komut satırından çalıştırıyormuş gibi tetiklemesini sağlar.

Örneğin, kaynak_klasoru/ içindeki tüm dosyaları yeni_arsiv.rar adında bir RAR dosyasına sıkıştırmak isteyelim:

CODE
12345678910111213141516171819202122232425262728293031323334353637383940414243444546
import subprocess
import os

kaynak_klasoru = "kaynak_klasoru"
hedef_rar_dosyasi = "yeni_arsiv.rar"
sifre = "gizlisifre" # İsteğe bağlı şifre

[b]Test için kaynak klasörü ve içine birkaç dosya oluşturalım[/b]
if not os.path.exists(kaynak_klasoru):
    os.makedirs(kaynak_klasoru)
    with open(os.path.join(kaynak_klasoru, "test1.txt"), "w") as f:
        f.write("Bu bir test dosyasıdır.")
    with open(os.path.join(kaynak_klasoru, "test2.log"), "w") as f:
        f.write("Log içeriği burada.")
    print(f"'{kaynak_klasoru}' klasörü ve örnek dosyalar oluşturuldu.")

try:
    # RAR komutunu oluşturma. 'a' arşiv ekleme, '-p' şifre belirtme.
    # Windows'ta 'rar.exe' veya 'WinRAR.exe', Linux'ta sadece 'rar'
    # Bu komutun sistem PATH'inde olması veya tam yolunun belirtilmesi gerekir.
    rar_command = ["rar", "a", "-ep1", "-r"] # -ep1: root klasörü arşive ekleme, -r: alt klasörleri de dahil et
    
    if sifre:
        rar_command.append(f"-p{sifre}") # Şifre ekleme
    
    rar_command.append(hedef_rar_dosyasi)
    rar_command.append(kaynak_klasoru) # Sıkıştırılacak klasör

    print(f"RAR oluşturma komutu çalıştırılıyor: {' '.join(rar_command)}")
    result = subprocess.run(rar_command, capture_output=True, text=True, check=True)

    print("RAR oluşturma işlemi tamamlandı.")
    print("Çıktı:")
    print(result.stdout)
    if result.stderr:
        print("Hata Çıktısı:")
        print(result.stderr)

except FileNotFoundError:
    print("Hata: 'rar' komutu bulunamadı. Lütfen sisteminizde WinRAR/RAR komut satırı aracının kurulu olduğundan ve PATH'inizde olduğundan emin olun.")
except subprocess.CalledProcessError as e:
    print(f"RAR oluşturma sırasında bir hata oluştu: {e}")
    print(f"Hata çıktısı: {e.stderr}")
except Exception as e:
    print(f"Beklenmeyen bir hata oluştu: {e}")


Bu örnekte, subprocess.run() ile rar komutunu çağırıyoruz. Komut satırı argümanları (a for add, -p for password, -ep1 to exclude base path, -r for recursive) WinRAR/RAR'ın kendi dokümantasyonundan alınmalıdır. Bu yaklaşım, Python'ın RAR oluşturma konusunda doğrudan bir yeteneği olmasa da, güçlü bir otomasyon aracı olarak kullanılabileceğini gösteriyor. Eğer RAR yerine ZIP dosyaları sizin için yeterliyse, Python'ın standart zipfile kütüphanesi ile doğrudan ZIP arşivleri oluşturmak çok daha kolay ve platform bağımsızdır.

Sık Karşılaşılan Sorunlar ve Çözümleri

RAR dosyalarıyla çalışırken bazı yaygın sorunlarla karşılaşmak mümkün. Bunların başında, unrar aracının sistemde bulunmaması veya PATH'e eklenmemesi geliyor. Eğer rarfile.RarFile nesnesini oluştururken rarfile.RarExecError veya FileNotFoundError gibi bir hata alıyorsanız, büyük ihtimalle sorun budur. Çözüm basit: unrar veya rar komut satırı aracını kurun ve PATH'inize ekleyin. Windows'ta bazen unrar.dll'nin doğru yerde olmaması da benzer sorunlara yol açabilir.

Bir diğer sıkıntı, bozuk veya eksik RAR arşivleridir. Eğer indirdiğiniz veya kopyaladığınız RAR dosyası hasarlıysa, rarfile.BadRarFile veya rarfile.RarCRCError gibi hatalarla karşılaşabilirsiniz. Bu durumda, RAR dosyasını onarmayı deneyebilir veya orijinal kaynağından tekrar indirmeyi düşünebilirsiniz. Çok parçalı RAR arşivlerinde, parçalardan birinin eksik olması da benzer hatalara yol açar.

Şifreli RAR dosyalarında yanlış şifre girmek de RarCRCError hatasına neden olur. Şifrenin doğru olduğundan ve Python'a bayt dizisi olarak (.encode('utf-8') ile) iletildiğinden emin olun. Karakter kodlaması da bazen sorun yaratabilir, özellikle farklı dillerdeki karakterler içeren şifrelerde.

Kapanış ve Tartışma

Gördüğünüz gibi, Python ile RAR dosyalarını yönetmek, doğru araçları ve yaklaşımları bildiğiniz sürece hiç de zor değil. Her ne kadar ZIP kadar doğrudan bir entegrasyon olmasa da, rarfile kütüphanesi ve subprocess modülü sayesinde bu kapalı kaynak formata bile programatik olarak hükmedebiliyoruz. Bu, otomasyon projelerinizde veya veri işleme süreçlerinizde karşınıza çıkabilecek birçok senaryoyu çözmenize yardımcı olacaktır.

Peki sizler RAR dosyalarıyla çalışırken ne gibi zorluklarla karşılaştınız? Hangi senaryolarda Python'ın bu yeteneklerini kullandınız veya kullanmayı planlıyorsunuz? Belki farklı kütüphaneler veya yaklaşımlar denediniz... Deneyimlerinizi ve düşüncelerinizi merak ediyorum, yorumlarda paylaşmaktan çekinmeyin!

Yanıt vermek için giriş yapmış olmalısınız.

0 alıntı seçildi