Scripts Python para Limpeza Automática de Arquivos: 3 Métodos Incríveis!

Foto do autor

By luis

Gerenciar manualmente a limpeza do sistema de arquivos é uma tarefa tediosa e ineficaz. A solução ideal é automatizar esse processo.

A ação de excluir arquivos e pastas manualmente pode ser bastante entediante e repetitiva. Automatizá-la não só economiza tempo, mas também garante uma limpeza mais consistente e organizada do sistema.

É nesse contexto que o Python se destaca, oferecendo uma solução prática e eficiente para simplificar nossas vidas. Python, sendo uma linguagem de programação versátil, é perfeita para a criação de scripts que automatizam tarefas rotineiras. Vamos explorar como o Python pode nos ajudar a superar essa tarefa sem dificuldades. Inicialmente, é importante entender por que Python é uma escolha acertada.

  • Python é uma das linguagens mais populares para a automação de tarefas.
  • Com Python, é possível realizar muito com pouco código, comparado a outras linguagens.
  • Python é compatível com diversos sistemas operacionais, permitindo que o mesmo código seja executado em Windows, Linux e macOS.
  • Python inclui um módulo chamado “os” que facilita a interação com o sistema operacional, o qual usaremos para automatizar a exclusão de arquivos.

Com Python, podemos automatizar qualquer tarefa de sistema repetitiva ou cansativa. Criar scripts para realizar tarefas específicas do sistema torna-se fácil se você tiver conhecimento em Python. Abaixo, examinaremos um caso prático.

Nota: As instruções a seguir foram testadas no Python 3.6 ou superior.

Removendo Arquivos/Pastas com Mais de X Dias

Com frequência, logs antigos tornam-se desnecessários e sua limpeza regular é crucial para liberar espaço de armazenamento. Isso se aplica a diversos tipos de arquivos, não apenas logs.

O módulo “os” oferece um método chamado “stat”, que fornece informações sobre o último acesso (st_atime), modificação (st_mtime) e alteração de metadados (st_ctime). Todos esses métodos retornam o tempo em segundos desde o “epoch”. Para mais detalhes sobre “epoch”, você pode pesquisar online.

Utilizaremos o método “os.walk(path)” para explorar as subpastas dentro de um diretório.

Siga os passos abaixo para escrever o código que remove arquivos/pastas com base em um número específico de dias.

  • Importe os módulos “time”, “os” e “shutil”.
  • Defina as variáveis para o caminho e número de dias.
  • Converta o número de dias em segundos utilizando o método “time.time()”.
  • Verifique se o caminho existe com o módulo “os.path.exists(path)”.
  • Caso o caminho exista, obtenha a lista de arquivos e pastas, incluindo subpastas, com “os.walk(path)”, que retorna um gerador com pastas, arquivos e subpastas.
  • Crie o caminho completo de arquivos e pastas usando “os.path.join()”.
  • Obtenha o “ctime” com “os.stat(path)” e o atributo “st_ctime”.
  • Compare o “ctime” com o tempo calculado.
  • Se o resultado for maior que o tempo desejado pelo usuário, verifique se é um arquivo ou pasta. Para arquivos, use “os.remove(path)”, e para pastas, utilize “shutil.rmtree()”.
  • Se o caminho não existir, exiba uma mensagem de “não encontrado”.

Vamos detalhar o código:

# importando os módulos necessários
import os
import shutil
import time

# função principal
def main():

	# inicializando o contador
	pastas_excluidas_contador = 0
	arquivos_excluidos_contador = 0

	# especifique o caminho
	caminho = "/CAMINHO_PARA_EXCLUIR"

	# especifique os dias
	dias = 30

	# convertendo dias em segundos
	# time.time() retorna o tempo atual em segundos
	segundos = time.time() - (dias * 24 * 60 * 60)

	# verificando se o arquivo está presente no caminho ou não
	if os.path.exists(caminho):
		
		# iterando sobre cada pasta e arquivo no caminho
		for pasta_raiz, pastas, arquivos in os.walk(caminho):

			# comparando os dias
			if segundos >= obter_idade_arquivo_pasta(pasta_raiz):

				# removendo a pasta
				remover_pasta(pasta_raiz)
				pastas_excluidas_contador += 1 # incrementando o contador

				# saindo após remover a pasta_raiz
				break

			else:

				# verificando as pastas a partir da pasta_raiz
				for pasta in pastas:

					# caminho da pasta
					caminho_pasta = os.path.join(pasta_raiz, pasta)

					# comparando com os dias
					if segundos >= obter_idade_arquivo_pasta(caminho_pasta):

						# invocando a função remover_pasta
						remover_pasta(caminho_pasta)
						pastas_excluidas_contador += 1 # incrementando o contador


				# verificando os arquivos do diretório atual
				for arquivo in arquivos:

					# caminho do arquivo
					caminho_arquivo = os.path.join(pasta_raiz, arquivo)

					# comparando os dias
					if segundos >= obter_idade_arquivo_pasta(caminho_arquivo):

						# invocando a função remover_arquivo
						remover_arquivo(caminho_arquivo)
						arquivos_excluidos_contador += 1 # incrementando o contador

		else:

			# se o caminho não for um diretório
			# comparando com os dias
			if segundos >= obter_idade_arquivo_pasta(caminho):

				# invocando o arquivo
				remover_arquivo(caminho)
				arquivos_excluidos_contador += 1 # incrementando o contador

	else:

		# arquivo/pasta não encontrado
		print(f'"{caminho}" não foi encontrado')
		arquivos_excluidos_contador += 1 # incrementando o contador

	print(f"Total de pastas excluídas: {pastas_excluidas_contador}")
	print(f"Total de arquivos excluídos: {arquivos_excluidos_contador}")


def remover_pasta(caminho):

	# removendo a pasta
	if not shutil.rmtree(caminho):

		# mensagem de sucesso
		print(f"{caminho} foi removido com sucesso")

	else:

		# mensagem de falha
		print(f"Não foi possível excluir {caminho}")



def remover_arquivo(caminho):

	# removendo o arquivo
	if not os.remove(caminho):

		# mensagem de sucesso
		print(f"{caminho} foi removido com sucesso")

	else:

		# mensagem de falha
		print(f"Não foi possível excluir {caminho}")


def obter_idade_arquivo_pasta(caminho):

	# obtendo ctime do arquivo/pasta
	# o tempo estará em segundos
	ctime = os.stat(caminho).st_ctime

	# retornando o tempo
	return ctime


if __name__ == '__main__':
	main()

É preciso ajustar as seguintes duas variáveis no código de acordo com suas necessidades:

dias = 30
caminho = "/CAMINHO_PARA_EXCLUIR"

Removendo Arquivos Maiores que X GB

Agora, vamos buscar e excluir arquivos que excedem um determinado tamanho. Este script é semelhante ao anterior; em vez de usar a idade como critério, usaremos o tamanho.

# importando o módulo os
import os

# função que retorna o tamanho de um arquivo
def obter_tamanho_arquivo(caminho):

	# obtendo o tamanho do arquivo em bytes
	tamanho = os.path.getsize(caminho)

	# retornando o tamanho do arquivo
	return tamanho


# função para excluir um arquivo
def remover_arquivo(caminho):

	# excluindo o arquivo
	if not os.remove(caminho):

		# sucesso
		print(f"{caminho} foi excluído com sucesso")

	else:

		# erro
		print(f"Não foi possível excluir {caminho}")


def main():
	# especifique o caminho
	caminho = "DIGITE_O_CAMINHO_AQUI"

	# defina o tamanho máximo do arquivo em MBs
	tamanho = 500

	# verificando se o caminho existe ou não
	if os.path.exists(caminho):

		# convertendo tamanho para bytes
		tamanho = tamanho * 1024 * 1024

		# percorrendo as subpastas
		for pasta_raiz, pastas, arquivos in os.walk(caminho):

			# iterando sobre a lista de arquivos
			for arquivo in arquivos:
				
				# obtendo o caminho do arquivo
				caminho_arquivo = os.path.join(pasta_raiz, arquivo)

				# verificando o tamanho do arquivo
				if obter_tamanho_arquivo(caminho_arquivo) >= tamanho:
					# invocando a função remover_arquivo
					remover_arquivo(caminho_arquivo)
			
		else:

			# verificando apenas se o caminho é um arquivo
			if os.path.isfile(caminho):
				# caminho não é um diretório
				# verificando o arquivo diretamente
				if obter_tamanho_arquivo(caminho) >= tamanho:
					# invocando a função remover_arquivo
					remover_arquivo(caminho)


	else:

		# caminho não existe
		print(f"{caminho} não existe")

if __name__ == '__main__':
	main()

Ajuste as duas variáveis seguintes:

caminho = "DIGITE_O_CAMINHO_AQUI"
tamanho = 500

Removendo Arquivos com uma Extensão Específica

Pode ser necessário excluir arquivos com base em seus tipos de extensão, por exemplo, arquivos “.log”. É possível encontrar a extensão usando o método “os.path.splitext(path)”, que retorna uma tupla com o caminho e a extensão do arquivo.

# importando o módulo os
import os

# função principal
def main():
    
    # especifique o caminho
    caminho = "CAMINHO_PARA_PROCURAR"
    
    # especifique a extensão
    extensao = ".log"
    
    # verificando se o caminho existe ou não
    if os.path.exists(caminho):
        
        # verificando se o caminho é um diretório ou não
        if os.path.isdir(caminho):
        
            # iterando através das subpastas
            for pasta_raiz, pastas, arquivos in os.walk(caminho):
                
                # verificando os arquivos
                for arquivo in arquivos:

                    # caminho do arquivo
                    caminho_arquivo = os.path.join(pasta_raiz, arquivo)

                    # extraindo a extensão do nome do arquivo
                    extensao_arquivo = os.path.splitext(caminho_arquivo)[1]

                    # verificando a extensão_arquivo
                    if extensao == extensao_arquivo:
                        
                        # excluindo o arquivo
                        if not os.remove(caminho_arquivo):
                            
                            # mensagem de sucesso
                            print(f"{caminho_arquivo} excluído com sucesso")
                            
                        else:
                            
                            # mensagem de falha
                            print(f"Não foi possível excluir {caminho_arquivo}")
        
        else:
            
            # caminho não é um diretório
            print(f"{caminho} não é um diretório")
    
    else:
        
        # caminho não existe
        print(f"{caminho} não existe")

if __name__ == '__main__':
    # invocando a função main
    main()

Lembre-se de ajustar o caminho e a variável de extensão no código acima para atender suas necessidades.

Recomendo testar esses scripts em um ambiente de NÃO PRODUÇÃO. Ao estar satisfeito com os resultados, você pode agendá-los com o “cron” (para Linux) para execução periódica em trabalhos de manutenção. Python é uma ferramenta poderosa para essas tarefas. Se você tiver interesse em aprender mais, considere este Curso Udemy.

Gostou do artigo? Compartilhe com seus colegas!