Jak sprawdzić rozmiar pliku i folderu w Pythonie?

Opublikowany: 2021-06-16

W tym artykule dowiesz się, jak sprawdzić rozmiar pliku lub folderu w Pythonie

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

Jednak jedną z jego najbardziej niedocenianych cech 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?

Python współdziała z systemem operacyjnym za pomocą modułów os, sys, path i subprocess

Nikt nie może żyć w izolacji od swojego otoczenia. Dotyczy to również Pythona, gdzie czasami niezbędna jest interakcja z systemem operacyjnym w celu wykonania zadań.

Python ma kilka modułów, które pozwalają nam na interakcję z systemem operacyjnym. Najczęściej używane są systemy operacyjne, sys, pathlib i podproces.

Ponieważ są to wbudowane moduły, nie musisz ich instalować za pomocą PIP. Możesz je wszystkie zaimportować za pomocą następującego oświadczenia:

 import os import sys import pathlib import subprocess

Poniższa lista przedstawia 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 reprezentować systemy plików jako obiekty, z odpowiednią semantyką dla każdego systemu operacyjnego.
  • Podproces: Wykonywanie i zarządzanie podprocesami bezpośrednio z Pythona. Wiąże się to z pracą z kodami stdin , stdout i powrotu . 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 Twoich potrzeb. Jednak przez większość czasu dobrze jest korzystać z powyższych modułów.

Uwaga: Większość funkcji udostępnianych przez te moduły będzie mieć różne dane wyjściowe w zależności od systemu operacyjnego. Pamiętaj, że zazwyczaj najlepszym dopasowaniem jest UNIX i Python.

Teraz, gdy wiesz już, 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 rozmiarze pliku i folderu w repozytorium Python GitHub

Korzystanie z os.stat().st_size

W tej metodzie użyjemy funkcji stat() z modułu os. Zwraca dużo informacji o określonej ścieżce.

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

Zanim przejdziemy dalej, utwórzmy plik testowy o nazwie lorem.txt , w którym zamierzamy wkleić jakiś głupi tekst . Możemy odwiedzić generator tekstu Lorem Ipsum i wkleić 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)

Zobaczmy, 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 twojego pliku lorem.txt .

Wyjście:

 20064

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

Najpierw zainstaluj pakiet humanizujący, uruchamiając w powłoce następujące polecenie:

 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 wyświetla rozmiar pliku w bajtach, a następnie wyświetla wynik w czytelnym rozmiarze.

Wyjście:

 20064 20.1 kB

Korzystanie z Pathlib

Chociaż pathlib jest zaprojektowany do pracy wyłącznie ze ścieżkami, zawiera kilka przydatnych funkcji z innych modułów jako metody obiektów Path (Instancje klasy Path).

Utwórz plik method2.py i zaimportuj klasę Path.

 from pathlib import Path

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

 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ć, otrzymaliśmy ten sam wynik, co przy pierwszej zastosowanej przez nas metodzie. 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ń Unixa z Subprocess:

Moduł podprocesów, pozwala nam wywoływać i zarządzać podprocesem z poziomu Pythona. Dlatego możemy uruchomić dowolne polecenie i potraktować jego wyjście bezpośrednio w Pythonie.

Uwaga: ta metoda działa tylko wtedy, gdy używasz 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 funkcję run z modułu podprocesów
  • Zmienna proces zawiera wynik wykonania polecenia du lorem.txt
    • du to narzędzie Linux, które pozwala nam uzyskać miejsce na dysku pliku
    • capture_output daje nam dostęp do atrybutu standout (standardowe wyjście)
    • tekst 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 tylko uzyskać rozmiar pliku, musisz podzielić dane wyjściowe (pamiętaj, że to ciąg) 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

Te dane wyjściowe nie są w ogóle czytelne. 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: instrukcję obsługi 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 wynik tego skryptu będzie znacznie bardziej czytelny:

 20K

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

Uzyskaj rekursywnie rozmiar folderu

Jeśli chcesz uzyskać rozmiar folderu, musisz wykonać iterację każdego pliku znajdującego się w katalogu i jego podkatalogach. Zrobimy to na dwa sposoby:

  • Iteracja po ścieżce z pathlib
  • Korzystanie z polecenia du z podprocesem

Poniższy kod będzie używał ścieżki do katalogu testowego w moim folderze domowym. Będziesz musiał zamienić ścieżkę tego pliku na katalog, w którym chcesz uzyskać rozmiar.

Iteracja po ścieżce z pathlib

Zobaczmy, jak 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, wyjaśnijmy, co robi każda część.

  • Importuj klasę Path i funkcję naturalsize()
  • Zdefiniuj funkcję get_size() z parametrem path , który domyślnie wskazuje na bieżący katalog.
  • Zmienna size to tylko symbol zastępczy, w którym będziemy dodawać rozmiar każdego pliku
  • Iteruj po każdym pliku ścieżki
    • Metoda rglob() rekurencyjnie zwraca pliki pasujące do wzorca
    • rglob('*') , oznacza, że ​​pobieramy wszystkie pliki z katalogu
  • 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

Korzystanie z polecenia du z podprocesem

Takie podejście ma kilka zalet:

  • Wynik jest nieco 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 zamiast pliku otrzymujemy rozmiar katalogu.

Wyjście:

 481M

Jak widać te dwa sposoby uzyskania rozmiaru folderu, zwraca nieco inny wynik. Im większy katalog, tym większą różnicę dostaniesz.

Do Ciebie należy wybór między podejściem pathlib lub podprocesem . Jeśli wiesz, że będziesz używać Linuksa za każdym razem, użyj subprocess , 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, ścieżka i podproces.

W tym samouczku nauczyłeś się:

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