Python'da Dosya ve Klasör Boyutu Nasıl Kontrol Edilir?
Yayınlanan: 2021-06-16Bu makalede, Python'da bir dosya veya klasörün boyutunu kontrol etmeyi öğreneceksiniz.
Python, en çok yönlü programlama dillerinden biridir. Bununla, küçük bir CLI (Komut satırı arayüzü) programından karmaşık bir web uygulamasına kadar oluşturabileceksiniz.
Bununla birlikte, en az değer verilen özelliklerinden biri, işletim sistemleriyle etkileşime girme yeteneğidir. İşletim sistemi operasyonlarını Python ile yönetmek, otomasyon süreçleri oluştururken size tonlarca zaman kazandırabilir.
Python'un işletim sistemi ile nasıl etkileşime girdiğini görelim.
Python işletim sistemi ile nasıl etkileşime girer?

Hiç kimse çevresinden izole yaşayamaz. Bu, bazen işleri halletmek için işletim sistemiyle etkileşim kurmanın temel olduğu Python'da da geçerlidir.
Python, işletim sistemi ile etkileşime girmemize izin veren birkaç modüle sahiptir. En çok kullanılanlar os, sys, pathlib ve subprocess'dir.
Yerleşik modüller oldukları için bunları PIP ile kurmanız gerekmez. Hepsini aşağıdaki ifadeyle içe aktarabilirsiniz:
import os import sys import pathlib import subprocessAşağıdaki liste, bu içe aktarmaların her birinin ana işlevselliğini gösterir:
- İşletim Sistemi : Sisteme özel (işletim sisteminize bağlı olarak) işlevselliği kullanmanın taşınabilir yolu. Daha gelişmiş bir şeye ihtiyacınız olmadığı sürece çoğu durumda doğru seçimdir.
- Sys: Sisteme özel parametreler ve fonksiyonlar. Bu modül, yorumlayıcı değişkenlerine ve işlevlerine erişim sağlar. İşletim sistemi modülü, işletim sistemi ile etkileşime girer ve sys, Python yorumlayıcısı ile etkileşime girer.
- Pathlib: Gelişmiş yol kullanımı. Dosya sistemlerini, her bir işletim sistemi için ilgili anlambilim ile nesneler olarak temsil etmenizi sağlar.
- Alt süreç : Doğrudan Python'dan yürütme ve alt süreç yönetimi. Bu,
stdin,stdoutve dönüş kodlarıyla çalışmayı içerir. Python alt süreç kılavuzumuzu okuyarak bu konuda daha fazla bilgi edinebilirsiniz.
İhtiyaçlarınıza bağlı olarak daha da özel işlevler içeren üst düzey kitaplıklar vardır. Ancak, çoğu zaman yukarıdaki modülleri kullanmakta fayda var.
Not: Bu modüller tarafından sağlanan işlevlerin çoğu, işletim sisteminize bağlı olarak farklı bir çıktıya sahip olacaktır. Genellikle en iyi eşleşmenin UNIX ve Python olduğunu unutmayın.
Artık Python'un işletim sistemi ile nasıl etkileşime girdiğini hızlıca anladınız, hadi dosya ve klasör boyutunu kontrol etme yöntemlerine geçelim. Aşağıdaki çözümlerin tümü Python GitHub deposundaki Dosya ve klasör boyutunda mevcuttur
os.stat().st_size kullanma
Bu yöntemde, os modülünden stat() işlevini kullanacağız. Belirli bir yol hakkında birçok bilgi döndürür.
Not: os.path.getsize() işlevi de işin yapılmasını sağlar. os.stat() kullanmanın avantajı . st_size o simlinks takip etmez olmasıdır.
Devam etmeden önce, içine biraz aptal metin yapıştıracağımız lorem.txt adlı bir test dosyası oluşturalım. Bir Lorem Ipsum metin oluşturucuyu ziyaret edebilir ve metni lorem.txt dosyasına yapıştırabiliriz.
Aynı dizinde method1.py adında bir dosya oluşturun ve aşağıdaki kodu yapıştırın:
import os size = os.stat('lorem.txt').st_size print(size)Şimdi bu kodla ne yaptığımızı parçalayalım:
- İlk satırda, os modülünü içe aktarıyoruz
- boyut değişkeni, lorem.txt dosyasının boyutunu içerir.
- os.stat() işlevi, dosyayla ilgili bir sürü bilgi döndürür
- st_size niteliği dosyanın boyutunu temsil eder
- Boyut değişkenini yazdırıyoruz
Python betiğini çalıştırmayı deneyin. lorem.txt dosyanızın içeriğine bağlı olarak farklı bir sonuç alırsınız.
Çıktı:
20064Çıktı bayt cinsinden temsil edilir. Bu hiç okunabilir değil, bu yüzden onu insanlaştıralım, böylece dosyanın boyutu hakkında daha iyi bir perspektife sahip olabiliriz.
İlk olarak, kabuğunuzda aşağıdaki komutu çalıştırarak humanize paketini kurun:
pip install humanizeArdından, bayt cinsinden bir değeri örneğin KB, MB, GB veya TB gibi okunabilir dosya boyutuna dönüştüren naturalsize() işlevini kullanabilirsiniz.
import os from humanize import naturalsize size = os.stat('lorem.txt').st_size print(size) print(naturalsize(size))İlk başta, yukarıdaki kod dosyanın boyutunu bayt olarak yazdırır, ardından sonucu okunabilir bir boyutta yazdırır.
Çıktı:
20064 20.1 kBPathlib'i kullanma
pathlib, yalnızca yollarla çalışmak üzere tasarlanmış olsa da, Path nesnelerinin yöntemleri (Path sınıfının Örnekleri) olarak diğer modüllerden bazı yararlı işlevleri içerir.
Bir method2.py dosyası oluşturun ve Path sınıfını içe aktarın.
from pathlib import PathArdından, yolu argüman olarak lorem.txt dosyasına ileten bir Path nesnesi oluşturun.
file_ = Path('lorem.txt')Artık Path sınıfının stat() yöntemine erişebilirsiniz. os.stat() işleviyle aynı şekilde çalışır, bu nedenle dosyanın boyutunu yazdırabilirsiniz.
print(file_.stat().st_size)Çıktı:
20064Gördüğünüz gibi, kullandığımız ilk yöntemle aynı sonucu aldık. Yukarıdaki sonuç da bayt biçiminde yazdırılır, bu nedenle okunabilir hale getirmek için humanize modülünü kullanabiliriz.
from pathlib import Path from humanize import naturalsize size = Path('lorem.txt').stat().st_size print(naturalsize(size))Bu kod aşağıdaki çıktıyı üretir:

20.1 kBUnix komutlarını Subprocess ile kullanma:
Alt süreç modülü, Python'dan alt süreci çağırmamızı ve yönetmemizi sağlar. Bu nedenle herhangi bir komutu çalıştırabilir ve çıktısını doğrudan Python'da işleyebiliriz.
Not: Bu yöntem yalnızca bir Unix OS (Linux, Mac) çalıştırıyorsanız çalışır.
Method3.py dosyasını açın ve aşağıdaki kodu yapıştırın:
from subprocess import run process = run(['du', 'lorem.txt'], capture_output=True, text=True) print(process.stdout)Bu kod parçasına dalmak:
- Alt işlem modülünden çalıştırma işlevini içe aktarıyoruz
- Değişken işlem, du lorem.txt komutunun çalıştırılmasının sonucunu içerir.
- du , bir dosyanın disk alanını almamızı sağlayan bir Linux yardımcı programıdır.
- Capture_output , öne çıkan (standart çıktı) özniteliğine erişmemizi sağlar
- metin , çıktıyı bayt yerine bir dize olarak sakladığımız anlamına gelir
- Sürecin standart çıktısını yazdırıyoruz
Yukarıdaki kodu çalıştırırsanız aşağıdaki çıktıyı alırsınız:
20 lorem.txtGördüğünüz gibi bize dosyanın boyutunu ve adını veriyor. Yalnızca dosyanın boyutunu elde etmek istiyorsanız, çıktıyı bölmeniz (bir dize olduğunu unutmayın) ve ilk öğeyi yazdırmanız gerekir.
from subprocess import run process = run(['du', 'lorem.txt'], capture_output=True, text=True) size = process.stdout.split()[0] print(size)Çıktı:
20Bu çıktı hiç okunabilir değil. Kullanılan ölçü biriminin KB olduğu sonucunu çıkarabiliriz (önceki yöntemlerden dolayı), ancak başka hiç kimse dosyanın boyutunu tahmin edemez.
Bu sorunu çözmek için -h (insan tarafından okunabilir) bayrağını kullanabiliriz.
Not: man du veya du –help komutunu çalıştırarak bu komutun bir kılavuzunu alabilirsiniz.
from subprocess import run process = run(['du', '-h', 'lorem.txt'], capture_output=True, text=True) size = process.stdout.split()[0] print(size)Şimdi bu betiğin çıktısı çok daha okunabilir olacak:
20KAlt süreç modülü ve olası uygulamalar hakkında daha fazla bilgi edinmek istiyorsanız Python alt süreç kılavuzumuza bakın.
Bir Klasörün Boyutunu Tekrarlı Olarak Alın
Bir klasörün boyutunu elde etmek istiyorsanız, dizinde ve alt dizinlerinde bulunan her dosya üzerinde yineleme yapmanız gerekir. Bunu iki yöntemle yapacağız:
- pathlib ile bir Yol üzerinde yineleme
- du komutunu alt işlemle kullanma
Aşağıdaki kod, ana klasörümdeki bir test dizinine giden yolu kullanacak. Boyutu almak istediğiniz dizin için o dosyanın yolunu değiştirmeniz gerekecektir.
pathlib ile bir Yol üzerinde yineleme
Dosyaların boyutları üzerinde yineleme yaparak bir dizinin boyutunu nasıl elde edebileceğinizi görelim.
from pathlib import Path from humanize import naturalsize def get_size(path = '.'): size = 0 for file_ in Path(path).rglob('*'): size += file_.stat().st_size return naturalsize(size) test_path = Path.home() / 'Documents/tests/' print(get_size(test_path))Bu kod parçası biraz korkutucu görünüyor, hadi her bir parçanın ne yaptığını çözelim.
- Path sınıfını ve naturalsize() işlevini içe aktarın
- get_size() işlevini, varsayılan olarak geçerli dizine işaret eden bir path parametresiyle tanımlayın.
- Boyut değişkeni, her dosyanın boyutunu ekleyeceğimiz yalnızca bir yer tutucudur.
- Yolun her dosyası üzerinde yineleme
- rglob() yöntemi, desenle eşleşen dosyaları yinelemeli olarak döndürür
- rglob('*') , dizindeki tüm dosyaları aldığımız anlamına gelir
- Her dosyanın boyutunu alın ve boyut değişkenine ekleyin
- Boyut değişkenini insan tarafından okunabilir bir şekilde döndürür
Tabii ki, işlevi yalnızca makinemde bulunan bir dizinle test ediyorum. Bilgisayarınızda bulunan bir klasörün yolunu değiştirmeyi unutmayın.
Benim durumumda aşağıdaki çıktıyı alıyorum:
403.4 MBSubprocess ile du Komutunu kullanma
Bu yaklaşımın bazı avantajları vardır:
- Sonuç biraz daha doğru
- çok daha hızlı
from subprocess import run from pathlib import Path test_path = Path.home() / 'Documents/tests/' process = run(['du', '-sh', test_path], capture_output=True, text=True) size = process.stdout.split()[0] print(size)Yöntem 3 ile aynı yaklaşımı kullanıyoruz, ancak bu sefer bir dosya yerine bir dizinin boyutunu alıyoruz.
Çıktı:
481MGördüğünüz gibi, bir klasörün boyutunu almanın bu iki yolu, biraz farklı bir sonuç döndürür. Dizin ne kadar büyük olursa, o kadar fazla fark elde edersiniz.
Pathlib veya alt süreç yaklaşımları arasında seçim yapmak size kalmış. Her subprocess kullandığınızda Linux kullanacağınızı biliyorsanız, aksi takdirde pathlib çözümünü kullanabilirsiniz.
Sonuç olarak
Python, işletim sistemi ile etkileşime girerken son derece kullanışlıdır. Python ile süreçleri otomatikleştirebilir ve çok zaman kazanabilirsiniz. İşletim sistemi ile etkileşime girecek ana modüller işletim sistemi, sistem, yol ve alt işlemdir.
Bu eğitimde şunları öğrendiniz:
- Python işletim sistemi ile nasıl etkileşime girer?
- İşletim sistemi işlemlerini yapmak için yerleşik modüllerin kullanımı
- İnsan tarafından okunabilir yazdırmak için insanlaştırma modülü nasıl kullanılır?
- 3 yaklaşımla bir dosyanın boyutunu hesaplamak için
- Bir dizinin boyutunu yinelemeli olarak veya du komutuyla hesaplamak için
