Obtención do tamaño dun ficheiro ou directorio (cartafol) en Python

Negocios

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