Uzyskiwanie rozmiaru pliku lub katalogu (folderu) w Pythonie

Biznes

Korzystając z biblioteki standardowej Pythona os, można uzyskać rozmiar (pojemność) pliku lub całkowity rozmiar plików znajdujących się w katalogu.

Wyjaśnione są trzy poniższe metody. Jednostkami wielkości, które można uzyskać, są bajty.

  • Uzyskaj rozmiar pliku:os.path.getsize()
  • Uzyskaj rozmiar katalogu, łącząc następujące funkcje (Python 3.5 lub nowszy):os.scandir()
  • Połącz następujące funkcje, aby uzyskać rozmiar katalogu (Python 3.4 i wcześniejsze):os.listdir()

Uzyskaj rozmiar pliku: os.path.getsize()

Rozmiar (pojemność) pliku może być uzyskana za pomocą os.path.getsize().

Jako argument podaj ścieżkę dostępu do pliku, którego rozmiar chcesz uzyskać.

import os

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

Uzyskaj rozmiar katalogu (folderu): os.scandir()

Aby obliczyć całkowity rozmiar plików zawartych w katalogu (folderze), użyj os.scandir().

Funkcja ta została dodana w Pythonie 3.5, więc wcześniejsze wersje używają os.listdir(). Przykład os.listdir() jest opisany później.

Zdefiniuj funkcję w następujący sposób.

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() zwraca iterator obiektu os.DirEntry.

Obiekt DirEntry, użyj metod is_file() i is_dir() aby określić czy jest to plik czy katalog. Jeśli jest to plik, rozmiar jest uzyskiwany z atrybutu st_size obiektu stat_result. W przypadku katalogu, funkcja ta jest wywoływana rekursywnie, aby zsumować wszystkie rozmiary i zwrócić całkowity rozmiar.

Dodatkowo, domyślnie, is_file() zwraca TRUE dla dowiązań symbolicznych do plików. Również, is_dir() zwraca true dla dowiązań symbolicznych do katalogów. Jeśli chcesz zignorować dowiązania symboliczne, ustaw argument follow_symlinks funkcji is_file() i is_dir() na false.

Ponadto, jeśli nie potrzebujesz przemierzać podkatalogów, możesz po prostu usunąć następującą część.

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

Powyższa funkcja zawiedzie, jeśli ścieżka do pliku zostanie przekazana jako argument. Jeśli potrzebujesz funkcji zwracającej rozmiar pliku lub katalogu, możesz napisać co następuje.

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

Uzyskaj rozmiar katalogu (folderu): os.listdir()

Nie ma os.scandir() w Pythonie 3.4 lub wcześniejszym, więc użyj os.listdir().

Zdefiniuj funkcję w następujący sposób.

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

Podstawowa idea jest taka sama jak w przypadku os.scandir().

To co można uzyskać za pomocą os.listdir() jest listą nazw plików (nazw katalogów). Każda nazwa pliku lub nazwa katalogu jest łączona ze ścieżką do katalogu nadrzędnego za pomocą os.path.join() w celu utworzenia pełnej ścieżki.

Jeśli cel jest dowiązaniem symbolicznym, os.path.isfile() i os.path.isdir() ocenią tę jednostkę. Tak więc, jeśli chcesz zignorować dowiązania symboliczne, użyj oceny warunkowej w połączeniu z os.path.islink(), która zwraca true dla dowiązań symbolicznych.

Podobnie jak w przypadku os.scandir(), jeśli nie potrzebujesz przemierzać podkatalogów, po prostu usuń następującą część.

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

Powyższa funkcja zawiedzie, jeśli ścieżka do pliku zostanie przekazana jako argument. Jeśli potrzebujesz funkcji zwracającej rozmiar pliku lub katalogu, możesz napisać co następuje.

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