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