Obtener el tamaño de un archivo o directorio (carpeta) en Python

Negocio

Utilizando la biblioteca estándar de Python os, puede obtener el tamaño (capacidad) de un archivo o el tamaño total de los archivos contenidos en un directorio.

Se explican los tres métodos siguientes. Las unidades de los tamaños que se pueden obtener son todos bytes.

  • Obtener el tamaño del archivo:os.path.getsize()
  • Obtenga el tamaño de un directorio combinando las siguientes funciones (Python 3.5 o posterior):os.scandir()
  • Combine las siguientes funciones para obtener el tamaño del directorio (Python 3.4 y anteriores):os.listdir()

Obtener el tamaño del archivo: os.path.getsize()

El tamaño (capacidad) del archivo se puede obtener con os.path.getsize().

Indique la ruta del archivo cuyo tamaño desea obtener como argumento.

import os

print(os.path.getsize('data/src/lena_square.png'))
# 473831

Obtener el tamaño de un directorio (carpeta): os.scandir()

Para calcular el tamaño total de los archivos contenidos en un directorio (carpeta), utilice os.scandir().

Esta función se añadió en Python 3.5, por lo que las versiones anteriores utilizan os.listdir(). El ejemplo de os.listdir() se describe más adelante.

Defina una función como la siguiente.

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() devuelve un iterador del objeto os.DirEntry.

DirEntry, utilice los métodos is_file() e is_dir() para determinar si es un archivo o un directorio. Si es un archivo, el tamaño se obtiene del atributo st_size del objeto stat_result. En el caso de un directorio, se llama a esta función de forma recursiva para sumar todos los tamaños y devolver el tamaño total.

Además, por defecto, is_file() devuelve TRUE para los enlaces simbólicos a archivos. Asimismo, is_dir() devuelve true para los enlaces simbólicos a directorios. Si desea ignorar los enlaces simbólicos, establezca el argumento follow_symlinks de is_file() e is_dir() en false.

Además, si no necesitas recorrer los subdirectorios, puedes simplemente eliminar la siguiente parte.

            elif entry.is_dir():
                total += get_dir_size(entry.path)

La función anterior fallará si se pasa la ruta del archivo como argumento. Si necesita una función que devuelva el tamaño de un archivo o un directorio, puede escribir lo siguiente.

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

Obtener el tamaño de un directorio (carpeta): os.listdir()

No hay os.scandir() en Python 3.4 o anterior, así que use os.listdir().

Defina una función como la siguiente.

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 es la misma que en el caso de os.scandir().

Lo que se puede obtener con os.listdir() es una lista de nombres de archivo (nombres de directorio). Cada nombre de archivo o directorio se une con la ruta del directorio padre con os.path.join() para crear la ruta completa.

Si el objetivo es un enlace simbólico, os.path.isfile() y os.path.isdir() juzgarán la entidad. Por lo tanto, si quiere ignorar los enlaces simbólicos, utilice el juicio condicional en combinación con os.path.islink(), que devuelve true para los enlaces simbólicos.

Como en el caso de os.scandir(), si no necesita recorrer los subdirectorios, simplemente elimine la parte siguiente.

        elif os.path.isdir(full_path):
            total += get_dir_size_old(full_path)

La función anterior fallará si se pasa la ruta del archivo como argumento. Si necesita una función que devuelva el tamaño de un archivo o un directorio, puede escribir lo siguiente.

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