Comment créer un site Web ou un blog en 2020 - Guide gratuit et facile pour créer un site Web

Scripts Python pour supprimer régulièrement des fichiers

Nettoyer régulièrement le système de fichiers manuellement n’est pas bon. Automatisez-les !

La suppression manuelle de fichiers et de dossiers n’est pas une tâche passionnante comme vous pourriez le penser. Il est logique de les automatiser.

Voici Python pour nous faciliter la vie. Python est un excellent langage de programmation pour les scripts. Nous allons profiter de Python pour terminer notre tâche sans aucune entrave. Tout d’abord, vous devez savoir pourquoi Python est un bon choix.

Python est le langage préféré de tous les temps pour automatiser les tâches Moins de code par rapport aux autres langages de programmation Python est pris en charge sur tous les systèmes d’exploitation. Vous pouvez exécuter le même code sur Windows, Linux et Mac. Python a un module appelé os qui nous aide à interagir avec le système d’exploitation. Nous allons utiliser ce module pour compléter notre automatisation de suppression de fichiers.

Nous pouvons remplacer toute tâche système ennuyeuse ou répétitive à l’aide de Python. Écrire des scripts pour accomplir une tâche système spécifique est un jeu d’enfant si vous connaissez Python. Regardons le cas d’utilisation suivant.

Remarque : ce qui suit est testé sur Python 3.6+

Supprimer les fichiers/dossiers de plus de X jours

Souvent, vous n’avez pas besoin de vieilles bûches et vous devez les nettoyer régulièrement pour libérer de l’espace de stockage. Il peut s’agir de n’importe quoi et pas seulement de journaux.

Nous avons une méthode appelée stat dans le module os qui donne des détails sur le dernier accès (st_atime), modification (st_mtime), et modification des métadonnées (st_ctime) heure. Toutes les méthodes renvoient le temps en secondes depuis l’époque. Vous pouvez trouver plus de détails sur l’heure ici.

Nous allons utiliser une méthode appelée os.walk(path) pour parcourir les sous-dossiers d’un dossier.

Suivez les étapes ci-dessous pour écrire le code de suppression des fichiers/dossiers en fonction du nombre de jours.

Importer les modules temps d’arrêt
Définissez le chemin et les jours en variables Convertissez le nombre de jours en secondes à l’aide de temps temps() method Vérifiez si le chemin existe ou non en utilisant la méthode os.path.exists(chemin) module Si le chemin existe, obtient la liste des fichiers et dossiers présents dans le chemin, y compris les sous-dossiers. utiliser la méthode os.walk(chemin), et renverra un générateur contenant des dossiers, des fichiers et des sous-dossiers Obtenez le chemin du fichier ou du dossier en joignant le chemin actuel et le nom du fichier/dossier à l’aide de la méthode os.path.join()
obtenir le l’heure depuis le os.stat(chemin) méthode utilisant l’attribut st_ctime
Comparez les l’heure avec le temps que nous avons calculé précédemment. Si le résultat est supérieur aux jours souhaités par l’utilisateur, il vérifie s’il s’agit d’un fichier ou d’un dossier. S’il s’agit d’un fichier, utilisez le os.remove(chemin) sinon utilisez le shutdown.rmtree() method Si le chemin n’existe pas, affiche le message introuvable

Voyons le code en détail.

# importing the required modules
import os
import shutil
import time

# main function
def main():

	# initializing the count
	deleted_folders_count = 0
	deleted_files_count = 0

	# specify the path
	path = "/PATH_TO_DELETE"

	# specify the days
	days = 30

	# converting days to seconds
	# time.time() returns current time in seconds
	seconds = time.time() - (days * 24 * 60 * 60)

	# checking whether the file is present in path or not
	if os.path.exists(path):
		
		# iterating over each and every folder and file in the path
		for root_folder, folders, files in os.walk(path):

			# comparing the days
			if seconds >= get_file_or_folder_age(root_folder):

				# removing the folder
				remove_folder(root_folder)
				deleted_folders_count += 1 # incrementing count

				# breaking after removing the root_folder
				break

			else:

				# checking folder from the root_folder
				for folder in folders:

					# folder path
					folder_path = os.path.join(root_folder, folder)

					# comparing with the days
					if seconds >= get_file_or_folder_age(folder_path):

						# invoking the remove_folder function
						remove_folder(folder_path)
						deleted_folders_count += 1 # incrementing count


				# checking the current directory files
				for file in files:

					# file path
					file_path = os.path.join(root_folder, file)

					# comparing the days
					if seconds >= get_file_or_folder_age(file_path):

						# invoking the remove_file function
						remove_file(file_path)
						deleted_files_count += 1 # incrementing count

		else:

			# if the path is not a directory
			# comparing with the days
			if seconds >= get_file_or_folder_age(path):

				# invoking the file
				remove_file(path)
				deleted_files_count += 1 # incrementing count

	else:

		# file/folder is not found
		print(f'"{path}" is not found')
		deleted_files_count += 1 # incrementing count

	print(f"Total folders deleted: {deleted_folders_count}")
	print(f"Total files deleted: {deleted_files_count}")


def remove_folder(path):

	# removing the folder
	if not shutil.rmtree(path):

		# success message
		print(f"{path} is removed successfully")

	else:

		# failure message
		print(f"Unable to delete the {path}")



def remove_file(path):

	# removing the file
	if not os.remove(path):

		# success message
		print(f"{path} is removed successfully")

	else:

		# failure message
		print(f"Unable to delete the {path}")


def get_file_or_folder_age(path):

	# getting ctime of the file/folder
	# time will be in seconds
	ctime = os.stat(path).st_ctime

	# returning the time
	return ctime


if __name__ == '__main__':
	main()

Vous devez ajuster les deux variables suivantes dans le code ci-dessus selon l’exigence.

days = 30 
path = "/PATH_TO_DELETE"

Supprimer les fichiers de plus de X Go

Trouvons les fichiers qui sont plus grands qu’une taille particulière et supprimons-les. Il est similaire au script précédent. Dans le script ci-dessus, nous avons pris années comme paramètre, et maintenant nous prendrons Taille comme paramètre de suppression.

# importing the os module
import os

# function that returns size of a file
def get_file_size(path):

	# getting file size in bytes
	size = os.path.getsize(path)

	# returning the size of the file
	return size


# function to delete a file
def remove_file(path):

	# deleting the file
	if not os.remove(path):

		# success
		print(f"{path} is deleted successfully")

	else:

		# error
		print(f"Unable to delete the {path}")


def main():
	# specify the path
	path = "ENTER_PATH_HERE"

	# put max size of file in MBs
	size = 500

	# checking whether the path exists or not
	if os.path.exists(path):

		# converting size to bytes
		size = size * 1024 * 1024

		# traversing through the subfolders
		for root_folder, folders, files in os.walk(path):

			# iterating over the files list
			for file in files:
				
				# getting file path
				file_path = os.path.join(root_folder, file)

				# checking the file size
				if get_file_size(file_path) >= size:
					# invoking the remove_file function
					remove_file(file_path)
			
		else:

			# checking only if the path is file
			if os.path.isfile(path):
				# path is not a dir
				# checking the file directly
				if get_file_size(path) >= size:
					# invoking the remove_file function
					remove_file(path)


	else:

		# path doesn't exist
		print(f"{path} doesn't exist")

if __name__ == '__main__':
	main()

Ajustez les deux variables suivantes.

path = "ENTER_PATH_HERE" 
size = 500

Supprimer les fichiers avec une extension spécifique

Il peut y avoir un scénario où vous souhaitez supprimer des fichiers par leurs types d’extension. Disons un fichier .log. Nous pouvons trouver l’extension d’un fichier en utilisant la méthode os.path.splitext(path). Renvoie un tuple contenant le chemin et l’extension du fichier.

# importing os module
import os

# main function
def main():
    
    # specify the path
    path = "PATH_TO_LOOK_FOR"
    
    # specify the extension
    extension = ".log"
    
    # checking whether the path exist or not
    if os.path.exists(path):
        
        # check whether the path is directory or not
        if os.path.isdir(path):
        
            # iterating through the subfolders
            for root_folder, folders, files in os.walk(path):
                
                # checking of the files
                for file in files:

                    # file path
                    file_path = os.path.join(root_folder, file)

                    # extracting the extension from the filename
                    file_extension = os.path.splitext(file_path)[1]

                    # checking the file_extension
                    if extension == file_extension:
                        
                        # deleting the file
                        if not os.remove(file_path):
                            
                            # success message
                            print(f"{file_path} deleted successfully")
                            
                        else:
                            
                            # failure message
                            print(f"Unable to delete the {file_path}")
        
        else:
            
            # path is not a directory
            print(f"{path} is not a directory")
    
    else:
        
        # path doen't exist
        print(f"{path} doesn't exist")

if __name__ == '__main__':
    # invoking main function
    main()

N’oubliez pas de mettre à jour le chemin et la variable d’extension dans le code ci-dessus pour répondre à vos besoins.

Je suggérerais de tester les scripts dans l’environnement NON-PRODUCTION. Une fois que vous êtes satisfait des résultats, vous pouvez programmer via cron (si vous utilisez Linux) pour l’exécuter périodiquement pour les travaux de maintenance. Python est excellent pour accomplir ces choses, et si vous souhaitez en savoir plus, consultez ce cours Udemy.