Obter o tamanho de um ficheiro ou directório (pasta) em Python

O negócio

Utilizando a biblioteca padrão Python os, pode obter o tamanho (capacidade) de um ficheiro ou o tamanho total dos ficheiros contidos num directório.

Os três métodos seguintes são explicados. As unidades dos tamanhos que podem ser obtidas são todas bytes.

  • Obtenha o tamanho do ficheiro:os.path.getsize()
  • Obtenha o tamanho de um directório através da combinação das seguintes funções (Python 3.5 ou posterior):os.scandir()
  • Combine as seguintes funções para obter o tamanho do directório (Python 3.4 e anteriores):os.listdir()

Obtenha o tamanho do ficheiro: os.path.getsize()

O tamanho (capacidade) do ficheiro pode ser obtido com os.path.getsize().

Dê o caminho do ficheiro cujo tamanho pretende obter como argumento.

import os

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

Obtenha o tamanho de um directório (pasta): os.scandir()

Para calcular o tamanho total dos ficheiros contidos num directório (pasta), utilizar os.scandir().

Esta função foi adicionada em Python 3.5, pelo que as versões anteriores usam os.listdir(). o exemplo os.listdir() é descrito mais tarde.

Definir uma função como se segue.

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 um iterador do objecto os.DirEntry.

DirEntry, usar os métodos is_file() e is_dir() para determinar se é um ficheiro ou um directório. Se for um ficheiro, o tamanho é obtido a partir do atributo st_size do objecto stat_result. No caso de um directório, esta função é chamada recursivamente para somar todos os tamanhos e devolver o tamanho total.

Além disso, por defeito, is_file() devolve VERDADEIRO para ligações simbólicas a ficheiros. Além disso, is_dir() retorna verdadeiro para ligações simbólicas a directórios. Se quiser ignorar ligações simbólicas, defina o argumento follow_symlinks de is_file() e is_dir() para falso.

Além disso, se não precisar de atravessar os subdirectórios, pode simplesmente apagar a parte seguinte.

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

A função acima falhará se o caminho do ficheiro for passado como um argumento. Se precisar de uma função para devolver o tamanho de um ficheiro ou de um directório, pode escrever 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

Obtenha o tamanho de um directório (pasta): os.listdir()

Não há os.scandir() em Python 3.4 ou anterior, portanto use os.listdir().

Definir uma função como se segue.

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 ideia básica é a mesma que no caso de os.scandir().

O que pode ser obtido com os.listdir() é uma lista de nomes de ficheiros (nomes de directórios). Cada nome de ficheiro ou nome de directório é unido ao caminho do directório pai com os.path.join() para criar o caminho completo.

Se o alvo for uma ligação simbólica, os.path.isfile() e os.path.isdir() irão julgar a entidade. Assim, se quiser ignorar ligações simbólicas, use o julgamento condicional em combinação com os.path.islink(), que retorna verdadeiro para ligações simbólicas.

Como no caso de os.scandir(), se não precisar de atravessar as subdirectorias, basta apagar a parte seguinte.

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

A função acima falhará se o caminho do ficheiro for passado como um argumento. Se precisar de uma função para devolver o tamanho de um ficheiro ou de um directório, pode escrever 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
Copied title and URL