Python’da bir dosyanın veya dizinin (klasörün) boyutunu alma

Python standart kitaplık işletim sistemini kullanarak bir dosyanın boyutunu (kapasitesini) veya bir dizinde bulunan dosyaların toplam boyutunu alabilirsiniz.

Aşağıdaki üç yöntem açıklanmıştır. Elde edilebilecek boyutların birimlerinin tümü bayttır.

  • Dosyanın boyutunu al:os.path.getsize()
  • Aşağıdaki işlevleri birleştirerek bir dizinin boyutunu alın (Python 3.5 veya üstü):os.scandir()
  • Dizinin boyutunu elde etmek için aşağıdaki işlevleri birleştirin (Python 3.4 ve önceki sürümler):os.listdir()

Dosyanın boyutunu al:os.path.getsize()

Dosyanın boyutu (kapasitesi) os.path.getsize() ile elde edilebilir.

Bir argüman olarak boyutunu almak istediğiniz dosyanın yolunu verin.

import os

print(os.path.getsize('data/src/lena_square.png'))
# 473831

Bir dizinin (klasör) boyutunu alın:os.scandir()

Bir dizinde (klasörde) bulunan dosyaların toplam boyutunu hesaplamak için os.scandir()’i kullanın.

Bu işlev Python 3.5’te eklenmiştir, bu nedenle önceki sürümler os.listdir() kullanır. os.listdir() örneği daha sonra anlatılacaktır.

Bir işlevi aşağıdaki gibi tanımlayın.

def get_dir_size(path='.'):
    total = 0
    with os.scandir(path) as it:
        for entry in it:
            if entry.is_file():
                total += entry.stat().st_size
            elif entry.is_dir():
                total += get_dir_size(entry.path)
    return total

print(get_dir_size('data/src'))
# 56130856

os.scandir(), os.DirEntry nesnesinin yineleyicisini döndürür.

DirEntry nesnesi, bir dosya mı yoksa bir dizin mi olduğunu belirlemek için is_file() ve is_dir() yöntemlerini kullanın. Bu bir dosyaysa, boyut, stat_result nesnesinin st_size özniteliğinden elde edilir. Bir dizin durumunda, tüm boyutları toplamak ve toplam boyutu döndürmek için bu işlev özyinelemeli olarak çağrılır.

Ayrıca, varsayılan olarak is_file(), dosyalara sembolik bağlantılar için DOĞRU döndürür. Ayrıca is_dir(), dizinlere sembolik bağlantılar için true değerini döndürür. Sembolik bağları yok saymak istiyorsanız, is_file() ve is_dir() öğelerinin follow_symlinks bağımsız değişkenini false olarak ayarlayın.

Ayrıca, alt dizinler arasında gezinmeniz gerekmiyorsa, aşağıdaki kısmı silebilirsiniz.

            elif entry.is_dir():
                total += get_dir_size(entry.path)

Dosyanın yolu bir argüman olarak iletilirse yukarıdaki işlev başarısız olur. Bir dosyanın veya dizinin boyutunu döndürmek için bir işleve ihtiyacınız varsa, aşağıdakileri yazabilirsiniz.

def get_size(path='.'):
    if os.path.isfile(path):
        return os.path.getsize(path)
    elif os.path.isdir(path):
        return get_dir_size(path)

print(get_size('data/src'))
# 56130856

print(get_size('data/src/lena_square.png'))
# 473831

Bir dizinin (klasör) boyutunu alın:os.listdir()

Python 3.4 veya önceki sürümlerde os.scandir() yoktur, bu nedenle os.listdir() kullanın.

Bir işlevi aşağıdaki gibi tanımlayın.

def get_dir_size_old(path='.'):
    total = 0
    for p in os.listdir(path):
        full_path = os.path.join(path, p)
        if os.path.isfile(full_path):
            total += os.path.getsize(full_path)
        elif os.path.isdir(full_path):
            total += get_dir_size_old(full_path)
    return total

print(get_dir_size_old('data/src'))
# 56130856

Temel fikir, os.scandir() örneğindekiyle aynıdır.

os.listdir() ile elde edilebilecek şey, dosya adlarının (dizin adlarının) bir listesidir. Her dosya adı veya dizin adı, tam yolu oluşturmak için os.path.join() ile üst dizinin yolu ile birleştirilir.

Hedef sembolik bir bağlantıysa, os.path.isfile() ve os.path.isdir() varlığı değerlendirecektir. Bu nedenle, sembolik bağları yok saymak istiyorsanız, sembolik bağlar için true değerini döndüren os.path.islink() ile birlikte koşullu yargıyı kullanın.

os.scandir() durumunda olduğu gibi, alt dizinler arasında geçiş yapmanız gerekmiyorsa, aşağıdaki kısmı silmeniz yeterlidir.

        elif os.path.isdir(full_path):
            total += get_dir_size_old(full_path)

Dosyanın yolu bir argüman olarak iletilirse yukarıdaki işlev başarısız olur. Bir dosyanın veya dizinin boyutunu döndürmek için bir işleve ihtiyacınız varsa, aşağıdakileri yazabilirsiniz.

def get_size_old(path='.'):
    if os.path.isfile(path):
        return os.path.getsize(path)
    elif os.path.isdir(path):
        return get_dir_size_old(path)

print(get_size_old('data/src'))
# 56130856

print(get_size_old('data/src/lena_square.png'))
# 473831
Copied title and URL