Usando o sistema operativo da biblioteca estándar de Python, pode obter o tamaño (capacidade) dun ficheiro ou o tamaño total dos ficheiros contidos nun directorio.
Explícanse os tres métodos seguintes. As unidades dos tamaños que se poden obter son todos bytes.
- Obter o tamaño do ficheiro:
os.path.getsize()
- Obtén o tamaño dun directorio combinando as seguintes funcións (Python 3.5 ou posterior):
os.scandir()
- Combina as seguintes funcións para obter o tamaño do directorio (Python 3.4 e anteriores):
os.listdir()
Obter o tamaño do ficheiro:os.path.getsize()
O tamaño (capacidade) do ficheiro pódese obter con os.path.getsize().
Indique a ruta do ficheiro cuxo tamaño quere obter como argumento.
import os
print(os.path.getsize('data/src/lena_square.png'))
# 473831
Obter o tamaño dun directorio (cartafol):os.scandir()
Para calcular o tamaño total dos ficheiros contidos nun directorio (cartafol), use os.scandir().
Esta función engadiuse en Python 3.5, polo que as versións anteriores usan os.listdir(). O exemplo de os.listdir() descríbese máis adiante.
Defina unha función do seguinte xeito.
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() devolve un iterador do obxecto os.DirEntry.
DirEntry, use os métodos is_file() e is_dir() para determinar se é un ficheiro ou un directorio. Se é un ficheiro, o tamaño obtense a partir do atributo st_size do obxecto stat_result. No caso dun directorio, esta función chámase recursivamente para sumar todos os tamaños e devolver o tamaño total.
Ademais, por defecto, is_file() devolve VERDADEIRO para ligazóns simbólicas a ficheiros. Ademais, is_dir() devolve verdadeiro para ligazóns simbólicas a directorios. Se queres ignorar as ligazóns simbólicas, configura o argumento follow_symlinks de is_file() e is_dir() en false.
Ademais, se non precisa percorrer os subdirectorios, pode simplemente eliminar a seguinte parte.
elif entry.is_dir():
total += get_dir_size(entry.path)
A función anterior fallará se a ruta do ficheiro se pasa como argumento. Se precisa unha función para devolver o tamaño dun ficheiro ou directorio, pode escribir o seguinte.
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
Obter o tamaño dun directorio (cartafol):os.listdir()
Non hai os.scandir() en Python 3.4 ou anterior, así que use os.listdir().
Defina unha función do seguinte xeito.
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
A idea básica é a mesma que no caso de os.scandir().
O que se pode obter con os.listdir() é unha lista de nomes de ficheiros (nomes de directorio). Cada nome de ficheiro ou nome de directorio únese á ruta do directorio pai con os.path.join() para crear a ruta completa.
Se o destino é unha ligazón simbólica, os.path.isfile() e os.path.isdir() xulgarán a entidade. Polo tanto, se quere ignorar as ligazóns simbólicas, use o xuízo condicional en combinación con os.path.islink(), que devolve verdadeiro para as ligazóns simbólicas.
Como no caso de os.scandir(), se non precisa percorrer os subdirectorios, simplemente elimine a seguinte parte.
elif os.path.isdir(full_path):
total += get_dir_size_old(full_path)
A función anterior fallará se a ruta do ficheiro se pasa como argumento. Se precisa unha función para devolver o tamaño dun ficheiro ou directorio, pode escribir o seguinte.
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