Utilitzant el sistema operatiu de la biblioteca estàndard de Python, podeu obtenir la mida (capacitat) d’un fitxer o la mida total dels fitxers continguts en un directori.
S’expliquen els tres mètodes següents. Les unitats de les mides que es poden obtenir són totes bytes.
- Obteniu la mida del fitxer:
os.path.getsize()
- Obteniu la mida d’un directori combinant les funcions següents (Python 3.5 o posterior):
os.scandir()
- Combina les funcions següents per obtenir la mida del directori (Python 3.4 i anteriors):
os.listdir()
Obteniu la mida del fitxer:os.path.getsize()
La mida (capacitat) del fitxer es pot obtenir amb os.path.getsize().
Doneu el camí del fitxer la mida del qual voleu obtenir com a argument.
import os
print(os.path.getsize('data/src/lena_square.png'))
# 473831
Obtenir la mida d’un directori (carpeta):os.scandir()
Per calcular la mida total dels fitxers continguts en un directori (carpeta), utilitzeu os.scandir().
Aquesta funció es va afegir a Python 3.5, de manera que les versions anteriors utilitzen os.listdir(). L’exemple os.listdir() es descriu més endavant.
Definiu una funció de la següent manera.
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
os.scandir() retorna un iterador de l’objecte os.DirEntry.
DirEntry, utilitzeu els mètodes is_file() i is_dir() per determinar si és un fitxer o un directori. Si és un fitxer, la mida s’obté de l’atribut st_size de l’objecte stat_result. En el cas d’un directori, aquesta funció es crida recursivament per sumar totes les mides i retornar la mida total.
A més, de manera predeterminada, is_file() retorna TRUE per als enllaços simbòlics als fitxers. A més, is_dir() retorna true per als enllaços simbòlics als directoris. Si voleu ignorar els enllaços simbòlics, configureu l’argument follow_symlinks d’is_file() i is_dir() a false.
A més, si no necessiteu recórrer els subdirectoris, només podeu eliminar la part següent.
elif entry.is_dir():
total += get_dir_size(entry.path)
La funció anterior fallarà si la ruta del fitxer es passa com a argument. Si necessiteu una funció per retornar la mida d’un fitxer o un directori, podeu escriure el següent.
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
Obtenir la mida d’un directori (carpeta):os.listdir()
No hi ha os.scandir() a Python 3.4 o anterior, així que utilitzeu os.listdir().
Definiu una funció de la següent manera.
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
La idea bàsica és la mateixa que en el cas d’os.scandir().
El que es pot obtenir amb os.listdir() és una llista de noms de fitxers (noms de directoris). Cada nom de fitxer o de directori s’uneix amb el camí del directori principal amb os.path.join() per crear el camí complet.
Si l’objectiu és un enllaç simbòlic, os.path.isfile() i os.path.isdir() jutjaran l’entitat. Per tant, si voleu ignorar els enllaços simbòlics, utilitzeu el judici condicional en combinació amb os.path.islink(), que retorna cert per als enllaços simbòlics.
Com en el cas d’os.scandir(), si no necessiteu recórrer els subdirectoris, suprimiu la part següent.
elif os.path.isdir(full_path):
total += get_dir_size_old(full_path)
La funció anterior fallarà si la ruta del fitxer es passa com a argument. Si necessiteu una funció per retornar la mida d’un fitxer o un directori, podeu escriure el següent.
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