Descubra o tamanho de arquivos e pastas em Python: 3 métodos eficazes!

Neste guia, você explorará métodos eficazes para determinar o tamanho de arquivos e pastas utilizando Python.

Python se destaca como uma linguagem de programação notavelmente versátil, permitindo a criação de desde simples ferramentas de linha de comando até aplicações web sofisticadas.

Uma característica frequentemente subestimada é sua capacidade de interagir com o sistema operacional. Essa interação pode otimizar significativamente seus esforços ao criar fluxos de automação.

Vamos descobrir como Python se comunica com o sistema operacional.

Comunicação entre Python e o Sistema Operacional

Nenhum sistema opera em isolamento. Da mesma forma, o Python muitas vezes precisa interagir com o sistema operacional para realizar tarefas essenciais.

O Python oferece vários módulos que facilitam essa interação, como os, sys, pathlib e subprocess, que são amplamente utilizados.

Esses módulos já vêm com o Python, dispensando a necessidade de instalação via PIP. Importe-os com a seguinte declaração:

import os
import sys
import pathlib
import subprocess

Abaixo, detalhamos as principais funções de cada um:

  • os: Oferece uma maneira padronizada de utilizar funcionalidades específicas do sistema, sendo a escolha ideal na maioria das situações.
  • sys: Permite acessar variáveis e funções do interpretador, interagindo diretamente com ele, enquanto o módulo os interage com o sistema.
  • pathlib: Simplifica o uso de caminhos, representando sistemas de arquivos como objetos, com semântica específica para cada sistema.
  • subprocess: Possibilita executar e gerenciar subprocessos diretamente do Python, interagindo com seus códigos stdin, stdout e return.

Para necessidades mais especializadas, bibliotecas de alto nível podem oferecer funcionalidades mais específicas, mas os módulos mencionados geralmente são suficientes.

Observação: As funções desses módulos podem ter saídas diferentes dependendo do sistema operacional, sendo o UNIX um sistema que frequentemente se alinha bem com o Python.

Com um entendimento básico de como Python interage com o sistema operacional, vamos abordar os métodos para verificar o tamanho de arquivos e pastas. Todas as soluções a seguir estão disponíveis no repositório GitHub File-and-folder-size-in-Python.

Utilizando os.stat().st_size

Este método emprega a função stat() do módulo os, que retorna várias informações sobre um caminho específico.

Observação: A função os.path.getsize() também pode realizar essa tarefa, mas os.stat().st_size se destaca por não seguir links simbólicos.

Antes de prosseguir, crie um arquivo de teste chamado lorem.txt e insira um texto qualquer. Você pode usar um gerador de texto Lorem Ipsum para criar o texto.

No mesmo diretório, crie um arquivo chamado method1.py e insira o seguinte código:

import os
size = os.stat('lorem.txt').st_size
print(size)

Analisando o código:

  • Importamos o módulo os.
  • A variável `size` armazena o tamanho do arquivo lorem.txt:
    • `os.stat()` retorna informações detalhadas sobre o arquivo.
    • `st_size` especifica o tamanho do arquivo.
  • O tamanho é impresso.

Execute o script. O resultado dependerá do conteúdo do arquivo lorem.txt.

Resultado:

20064

A saída está em bytes, o que pode ser difícil de interpretar. Para torná-la mais legível, podemos usar um conversor.

Primeiro, instale o pacote humanize usando o comando:

pip install humanize

Agora, utilize a função `naturalsize()`, que converte bytes em formatos como KB, MB, GB ou TB.

import os
from humanize import naturalsize

size = os.stat('lorem.txt').st_size

print(size)
print(naturalsize(size))

O código acima imprime o tamanho em bytes e, em seguida, em um formato legível.

Resultado:

20064
20.1 kB

Utilizando Pathlib

Embora o módulo pathlib seja projetado para manipular caminhos, ele integra funções úteis de outros módulos, como métodos de objetos Path (instâncias da classe Path).

Crie um arquivo method2.py e importe a classe Path.

from pathlib import Path

Crie um objeto Path fornecendo o caminho para o arquivo lorem.txt como argumento.

file_ = Path('lorem.txt')

Agora, use o método `stat()` da classe Path para obter o tamanho do arquivo.

print(file_.stat().st_size)

Resultado:

20064

Como visto, obtemos o mesmo resultado que com o primeiro método. Para formatá-lo de forma legível, use o módulo humanize.

from pathlib import Path
from humanize import naturalsize

size = Path('lorem.txt').stat().st_size

print(naturalsize(size))

Este código produz a seguinte saída:

20.1 kB

Utilizando Comandos Unix com Subprocess

O módulo subprocess permite que você execute e gerencie subprocessos a partir do Python, incluindo a execução de comandos e o tratamento de suas saídas diretamente.

Observação: Este método só funcionará em sistemas operacionais Unix (Linux, macOS).

Crie um arquivo chamado method3.py e adicione o seguinte código:

from subprocess import run

process = run(['du', 'lorem.txt'], capture_output=True, text=True)

print(process.stdout)

Analisando o código:

  • Importamos a função run do módulo subprocess.
  • A variável `process` armazena o resultado da execução do comando `du lorem.txt`.
    • `du` é um utilitário Linux que retorna o espaço em disco de um arquivo.
    • `capture_output` permite acessar o atributo `stdout` (saída padrão).
    • `text` indica que a saída será armazenada como string, não bytes.
  • A saída padrão do processo é impressa.

A execução do código acima produz a seguinte saída:

20      lorem.txt

O tamanho e o nome do arquivo são fornecidos. Se você só precisa do tamanho, você deve separar a saída (que é uma string) e imprimir o primeiro elemento.

from subprocess import run

process = run(['du', 'lorem.txt'], capture_output=True, text=True)

size = process.stdout.split()[0]

print(size)

Resultado:

20

A saída, neste formato, não é legível. É possível deduzir que a unidade de medida é KB (devido aos métodos anteriores), mas não é intuitivo.

Para resolver isso, use o sinalizador -h (human-readable).

Observação: Execute man du ou du –help para mais informações.

from subprocess import run

process = run(['du', '-h', 'lorem.txt'], capture_output=True, text=True)

size = process.stdout.split()[0]

print(size)

A saída será muito mais legível:

20K

Para mais informações sobre o módulo subprocess, veja o guia de subprocesso Python.

Obtenção do Tamanho de uma Pasta Recursivamente

Para obter o tamanho de uma pasta, você precisa iterar sobre todos os arquivos presentes no diretório e seus subdiretórios. Faremos isso com dois métodos:

  • Iterando sobre um caminho com pathlib.
  • Usando o comando du com subprocess.

O código abaixo usará um caminho para um diretório de teste. Substitua este caminho pelo diretório desejado.

Iterando sobre um Caminho com pathlib

Veja como obter o tamanho de um diretório iterando sobre o tamanho de seus arquivos.

from pathlib import Path
from humanize import naturalsize

def get_size(path="."):
    size = 0

    for file_ in Path(path).rglob('*'):

        size += file_.stat().st_size
    
    return naturalsize(size)

test_path = Path.home() / 'Documents/tests/'

print(get_size(test_path))

Analisando o código:

  • Importamos a classe Path e a função naturalsize().
  • Definimos a função get_size(), com um parâmetro de caminho, que por padrão aponta para o diretório atual.
  • A variável `size` é um marcador onde adicionaremos o tamanho de cada arquivo.
  • Iteramos sobre todos os arquivos do caminho.
  • Obtemos o tamanho de cada arquivo e o adicionamos à variável `size`.
  • Retornamos a variável `size` em um formato legível.

Teste a função com um diretório existente em seu computador.

No meu caso, a saída é:

403.4 MB

Utilizando o Comando du com Subprocess

Essa abordagem possui vantagens:

  • O resultado é mais preciso.
  • É mais rápido.
from subprocess import run
from pathlib import Path

test_path = Path.home() / 'Documents/tests/'

process = run(['du', '-sh', test_path], capture_output=True, text=True)

size = process.stdout.split()[0]

print(size)

Estamos usando a mesma abordagem do método 3, mas para obter o tamanho de um diretório.

Resultado:

481M

As duas abordagens retornam resultados ligeiramente diferentes. Quanto maior o diretório, maior a diferença.

Escolha entre pathlib e subprocess. Se você sempre usar Linux, subprocess é uma boa escolha, caso contrário, use pathlib.

Resumo

Os recursos do Python para interação com o sistema operacional são cruciais para automatizar tarefas e economizar tempo. Os módulos chave são os, sys, path e subprocess.

Neste guia você aprendeu:

  • Como Python interage com o sistema operacional.
  • Como utilizar módulos integrados para operações de sistema operacional.
  • O uso do módulo humanize para tornar as saídas legíveis.
  • Como calcular o tamanho de um arquivo com 3 abordagens.
  • Como calcular o tamanho de um diretório recursivamente ou com o comando du.