Jak sprawdzić rozmiar pliku i folderu w Pythonie?
Opublikowany: 2021-06-16W 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?

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 subprocessPoniż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,stdouti 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:
20064Dane 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 humanizeNastę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 kBKorzystanie 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 PathNastę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:
20064Jak 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 kBUż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.txtJak 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:
20Te 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:
20KJeś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 MBKorzystanie 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:
481MJak 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
