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.
Spis treści:
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