Jak sprawdzić rozmiar pliku i folderu w Pythonie?

W tym artykule nauczysz się sprawdzać rozmiar pliku lub folderu w Pythonie

Python jest jednym z najbardziej wszechstronnych języków programowania. Dzięki niemu będziesz w stanie zbudować od małego programu CLI (interfejs wiersza poleceń) do złożonej aplikacji internetowej.

Jednak jedną z jego najbardziej niedocenianych funkcji jest możliwość interakcji z systemami operacyjnymi. Zarządzanie operacjami systemu operacyjnego za pomocą Pythona może zaoszczędzić mnóstwo czasu podczas tworzenia procesów automatyzacji.

Zobaczmy, jak Python współdziała z systemem operacyjnym.

Jak Python współdziała z systemem operacyjnym?

Nikt nie może żyć w izolacji od swojego otoczenia. Dotyczy to również Pythona, gdzie czasami interakcja z systemem operacyjnym ma fundamentalne znaczenie, aby załatwić sprawę.

Python ma kilka modułów, które pozwalają nam wchodzić w interakcje z systemem operacyjnym. Najczęściej używane to os, sys, pathlib i subprocess.

Ponieważ są to wbudowane moduły, nie trzeba ich instalować za pomocą PIP. Możesz zaimportować je wszystkie za pomocą następującej instrukcji:

import os
import sys
import pathlib
import subprocess

Poniższa lista wskazuje główne funkcje każdego z tych importów:

  • System operacyjny: Przenośny sposób korzystania z funkcji specyficznych dla systemu (w zależności od systemu operacyjnego). W większości przypadków jest to właściwy wybór, chyba że potrzebujesz czegoś bardziej zaawansowanego
  • Sys: Parametry i funkcje specyficzne dla systemu. Ten moduł zapewnia dostęp do zmiennych i funkcji interpretera. Moduł os współdziała z systemem operacyjnym, a sys z interpreterem Pythona
  • Pathlib: Zaawansowane użycie ścieżki. Pozwala przedstawiać systemy plików jako obiekty, z odpowiednią semantyką dla każdego systemu operacyjnego.
  • Subprocess: Wykonywanie i zarządzanie podprocesami bezpośrednio z Pythona. Obejmuje to pracę z kodami stdin, stdout i return. Możesz dowiedzieć się więcej na ten temat, czytając nasz przewodnik po podprocesach Pythona.

Istnieją biblioteki wysokiego poziomu, które zawierają jeszcze bardziej szczegółowe funkcje w zależności od potrzeb. Jednak przez większość czasu możesz korzystać z powyższych modułów.

Uwaga: Większość funkcji zapewnianych przez te moduły będzie miała różne dane wyjściowe w zależności od systemu operacyjnego. Pamiętaj, że zwykle najlepsze dopasowanie jest UNIX i Pythona.

Teraz, gdy już wiesz, jak Python współdziała z systemem operacyjnym, przejdźmy do metod sprawdzania rozmiaru plików i folderów. Wszystkie poniższe rozwiązania są dostępne w Rozmiar pliku i folderu w Pythonie Repozytorium GitHub

Używając os.stat().st_size

W tej metodzie użyjemy tzw stan() funkcja z modułu os. Zwraca wiele informacji o określonej ścieżce.

Uwaga: Funkcja os.path.getsize() również wykonuje zadanie. Zaletą korzystania z os.stat().st_size jest to, że nie podąża za simlinkami.

Zanim przejdziemy dalej, stwórzmy plik testowy o nazwie lorem.txt, w którym wkleimy jakiś głupi tekst. Możemy odwiedzić A Generator tekstu Lorem Ipsum i wklej tekst do pliku lorem.txt.

W tym samym katalogu utwórz plik o nazwie method1.py i wklej poniższy kod:

import os
size = os.stat('lorem.txt').st_size
print(size)

Podzielmy to, co robimy z tym kodem:

  • W pierwszym wierszu importujemy moduł os
  • Zmienna size zawiera rozmiar pliku lorem.txt
    • Funkcja os.stat() zwraca garść informacji związanych z plikiem
    • Atrybut st_size reprezentuje rozmiar pliku
  • Drukujemy zmienną rozmiaru

Spróbuj uruchomić skrypt Pythona. Otrzymasz inny wynik w zależności od zawartości pliku lorem.txt.

Wyjście:

20064

Dane wyjściowe są reprezentowane w bajtach. To w ogóle nie jest czytelne, więc zhumanizujmy to, abyśmy mogli mieć lepszą perspektywę rozmiaru pliku.

Najpierw zainstaluj humanizować package, uruchamiając następujące polecenie w powłoce:

pip install humanize

Następnie możesz użyć funkcji naturalsize(), która konwertuje wartość w bajtach na czytelny rozmiar pliku, na przykład KB, MB, GB lub TB.

import os
from humanize import naturalsize

size = os.stat('lorem.txt').st_size

print(size)
print(naturalsize(size))

Na początku powyższy kod drukuje rozmiar pliku w bajtach, a następnie drukuje wynik w czytelnym rozmiarze.

Wyjście:

20064
20.1 kB

Korzystanie z Pathliba

Mimo że pathlib jest przeznaczony do pracy wyłącznie ze ścieżkami, zawiera kilka przydatnych funkcji z innych modułów jako metody obiektów Path (klasa Instances of Path).

Utwórz plik method2.py i zaimportuj plik Klasa ścieżki.

from pathlib import Path

Następnie utwórz obiekt Path, przekazując jako argument ścieżkę do pliku lorem.txt.

file_ = Path('lorem.txt')

Teraz możesz uzyskać dostęp do metody stat() klasy Path. Działa tak samo jak funkcja os.stat(), dlatego będziesz mógł wydrukować rozmiar pliku.

print(file_.stat().st_size)

Wyjście:

20064

Jak widać, uzyskaliśmy taki sam wynik, jak w przypadku pierwszej metody, której użyliśmy. Powyższy wynik jest również drukowany w formacie bajtowym, więc możemy użyć modułu humanizacji, aby był czytelny.

from pathlib import Path
from humanize import naturalsize

size = Path('lorem.txt').stat().st_size

print(naturalsize(size))

Ten kod generuje następujące dane wyjściowe:

20.1 kB

Używanie poleceń Unix z Subprocess:

Moduł subprocess pozwala nam wywoływać i zarządzać subprocess z Pythona. Dlatego możemy uruchomić dowolne polecenie i potraktować jego wynik bezpośrednio w Pythonie.

Uwaga: ta metoda działa tylko wtedy, gdy korzystasz z systemu operacyjnego Unix (Linux, Mac)

Otwórz plik method3.py i wklej poniższy kod:

from subprocess import run

process = run(['du', 'lorem.txt'], capture_output=True, text=True)

print(process.stdout)

Zagłębiając się w ten fragment kodu:

  • Importujemy tzw uruchomić funkcję z modułu podprocesu
  • Zmienna proces zawiera wynik działania polecenia du lorem.txt
    • du to narzędzie Linuksa, które pozwala nam uzyskać miejsce na dysku dla pliku
    • capture_output daje nam dostęp do atrybutu standout (standardowe wyjście).
    • text oznacza, że ​​przechowujemy dane wyjściowe jako ciąg znaków zamiast bajtów
  • Drukujemy standardowe wyjście procesu

Jeśli uruchomisz powyższy kod, otrzymasz następujące dane wyjściowe:

20      lorem.txt

Jak widać, podaje nam rozmiar i nazwę pliku. Jeśli chcesz uzyskać tylko rozmiar pliku, musisz podzielić dane wyjściowe (pamiętaj, że jest to ciąg znaków) i wydrukować pierwszy element.

from subprocess import run

process = run(['du', 'lorem.txt'], capture_output=True, text=True)

size = process.stdout.split()[0]

print(size)

Wyjście:

20

To wyjście jest w ogóle nieczytelne. Możemy wywnioskować, że użytą jednostką miary jest KB (ze względu na poprzednie metody), ale nikt inny nie mógł odgadnąć rozmiaru pliku.

Aby rozwiązać ten problem, możemy skorzystać z flagi -h (czytelnej dla człowieka).

Uwaga: Podręcznik tego polecenia można uzyskać, uruchamiając man du lub du –help.

from subprocess import run

process = run(['du', '-h', 'lorem.txt'], capture_output=True, text=True)

size = process.stdout.split()[0]

print(size)

Teraz dane wyjściowe tego skryptu będą znacznie bardziej czytelne:

20K

Jeśli chcesz dowiedzieć się więcej o module subprocess i możliwych zastosowaniach, zapoznaj się z naszym przewodnikiem po podprocesach Pythona.

Uzyskaj rozmiar folderu rekurencyjnie

Jeśli chcesz uzyskać rozmiar folderu, musisz iterować po każdym pliku obecnym w katalogu i jego podkatalogach. Zrobimy to na dwa sposoby:

  • Iteracja po ścieżce za pomocą pathlib
  • Używanie polecenia du z subprocess

Poniższy kod będzie używał ścieżki do katalogu testowego w moim folderze domowym. Będziesz musiał zastąpić ścieżkę tego pliku dla katalogu, który chcesz uzyskać rozmiar.

Iteracja po ścieżce za pomocą pathlib

Zobaczmy, jak możesz uzyskać rozmiar katalogu, iterując po rozmiarach plików.

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))

Ten fragment kodu wydaje się trochę przerażający, podzielmy się tym, co robi każda część.

  • Zaimportuj klasę Path i funkcję naturalsize().
  • Zdefiniuj funkcję get_size() ze ścieżką parametru, która domyślnie wskazuje bieżący katalog.
  • Zmienna rozmiaru to tylko symbol zastępczy, w którym będziemy dodawać rozmiar każdego pliku
  • Iteruj po każdym pliku ścieżki
  • Pobierz rozmiar każdego pliku i dodaj go do zmiennej rozmiaru
  • Zwraca zmienną rozmiaru w sposób czytelny dla człowieka

Oczywiście testuję funkcję z katalogiem dostępnym tylko na moim komputerze. Nie zapomnij zmienić ścieżki do folderu, który istnieje na twoim komputerze.

W moim przypadku otrzymuję następujące dane wyjściowe:

403.4 MB

Używanie polecenia du z Subprocess

Takie podejście ma pewne zalety:

  • Wynik jest trochę dokładniejszy
  • Jest znacznie szybszy
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)

Używamy tego samego podejścia co w metodzie 3, ale tym razem otrzymujemy rozmiar katalogu zamiast pliku.

Wyjście:

481M

Jak widać, te dwa sposoby uzyskania rozmiaru folderu zwracają nieco inny wynik. Im większy katalog, tym większa różnica, jaką uzyskasz.

Do Ciebie należy wybór między podejściem pathlib a podejściem podprocesowym. Jeśli wiesz, że będziesz używać Linuksa za każdym razem, gdy użyjesz podprocesu, w przeciwnym razie możesz użyć rozwiązania pathlib.

Podsumowując

Wyniki Pythona są niezwykle przydatne podczas interakcji z systemem operacyjnym. Dzięki Pythonowi możesz zautomatyzować procesy i zaoszczędzić dużo czasu. Główne moduły do ​​interakcji z systemem operacyjnym to os, sys, path i subprocess.

W tym samouczku nauczyłeś się:

  • Jak Python współdziała z systemem operacyjnym
  • Wykorzystanie wbudowanych modułów do wykonywania operacji OS
  • Jak używać modułu humanizacji do drukowania w sposób czytelny dla człowieka
  • Aby obliczyć rozmiar pliku z 3 podejściami
  • Aby obliczyć rozmiar katalogu rekurencyjnie lub za pomocą polecenia du