A Python standard könyvtár os segítségével megtudhatja egy fájl méretét (kapacitását) vagy egy könyvtárban található fájlok teljes méretét.
A következő három módszert ismertetjük. Az elérhető méretek egységei mind bájtok.
- A fájl méretének lekérdezése:
os.path.getsize()
- Egy könyvtár méretének kiszámítása a következő függvények kombinálásával (Python 3.5 vagy újabb):
os.scandir()
- A következő függvények kombinálásával kapjuk meg a könyvtár méretét (Python 3.4 és korábbi verziók):
os.listdir()
A fájl méretének lekérdezése: os.path.getsize()
A fájl méretét (kapacitását) az os.path.getsize() segítségével lehet megtudni.
Érvként adja meg annak a fájlnak az elérési útvonalát, amelynek a méretét meg szeretné kapni.
import os
print(os.path.getsize('data/src/lena_square.png'))
# 473831
Egy könyvtár (mappa) méretének lekérdezése: os.scandir()
Egy könyvtárban (mappában) található fájlok teljes méretének kiszámításához használja az os.scandir() parancsot.
Ez a függvény a Python 3.5-ben jelent meg, ezért a korábbi verziók az os.listdir() függvényt használják. os.listdir() példát később ismertetjük.
Definiáljon egy függvényt a következőképpen.
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
Az os.scandir() egy os.DirEntry objektum iterátorát adja vissza.
DirEntry objektumot, az is_file() és az is_dir() metódusokkal határozzuk meg, hogy fájlról vagy könyvtárról van-e szó. Ha fájlról van szó, a méretét a stat_result objektum st_size attribútumából kapjuk meg. Könyvtár esetén ezt a függvényt rekurzívan kell meghívni, hogy összeadja az összes méretet, és visszaadja a teljes méretet.
Ezenkívül az is_file() alapértelmezés szerint TRUE értéket ad vissza a fájlokra mutató szimbolikus hivatkozások esetében. Az is_dir() is true-t ad vissza a könyvtárakra mutató szimbolikus hivatkozásokra. Ha figyelmen kívül akarja hagyni a szimbolikus hivatkozásokat, állítsa az is_file() és az is_dir() follow_symlinks argumentumát false-ra.
Ha nincs szükséged az alkönyvtárak bejárására, akkor a következő részt egyszerűen törölheted.
elif entry.is_dir():
total += get_dir_size(entry.path)
A fenti függvény sikertelen lesz, ha a fájl elérési útját adjuk meg argumentumként. Ha szükséged van egy olyan függvényre, amely visszaadja egy fájl vagy könyvtár méretét, akkor a következőt írhatod.
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
Egy könyvtár (mappa) méretének lekérdezése: os.listdir()
A Python 3.4 vagy korábbi verziókban nincs os.scandir(), ezért használd az os.listdir() parancsot.
Definiáljon egy függvényt a következőképpen.
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
Az alapötlet ugyanaz, mint az os.scandir() esetében.
Az os.listdir() segítségével a fájlnevek (könyvtárnevek) listáját kaphatjuk meg. Minden egyes fájl- vagy könyvtárnév az os.path.join() segítségével összekapcsolódik a szülő könyvtár elérési útvonalával, így jön létre a teljes elérési útvonal.
Ha a cél egy szimbolikus link, az os.path.isfile() és az os.path.isdir() értékeli az entitást. Ha tehát figyelmen kívül akarjuk hagyni a szimbolikus linkeket, használjuk a feltételes megítélést az os.path.islink()-vel kombinálva, amely a szimbolikus linkek esetén igazat ad vissza.
Ahogy az os.scandir() esetében is, ha nincs szükségünk az alkönyvtárak bejárására, csak töröljük a következő részt.
elif os.path.isdir(full_path):
total += get_dir_size_old(full_path)
A fenti függvény sikertelen lesz, ha a fájl elérési útját adjuk meg argumentumként. Ha szükséged van egy olyan függvényre, amely visszaadja egy fájl vagy könyvtár méretét, akkor a következőt írhatod.
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