Résolue

Problème de tri de fichier dans un projet perso

# Résolution d'erreurs # Fichiers

Hello,

j'ai un problème de tri d'une liste dans un projet. J'aimerais supprimer les fichiers ayant un indice plus petit que le plus grand dans des dossiers.

J'ai 2 soucis :

1 - le tri ne se fait pas numériquement, dans mon programme les indices .10 et .13 arrive avant l'indice .2 donc le fichier .2 n'est jamais supprimé

2 - lorsque je souhaite supprimer le fichier avec la commande os.remove() j'ai le message d'erreur : FileNotFoundError: [WinError 2] Le fichier spécifié est introuvable: 'test_creo.txt.1'


Quelqu'un peu m'aider peut être ?


au préalable j'ai bien créé les dossiers :


None


import os

dossier_traite = input("Quel dossier traiter ? ")
fichier_supprime = []

for folder_name, subfolders, filenames in os.walk(dossier_traite):
    ext = 1
    sorted(filenames)
    for subfolder in subfolders:
        print(f'SUBFOLDER OF {folder_name}\{subfolder}')
    for filename in filenames:
        print(filename)
        file_name, file_extension = os.path.splitext(filename)
        file_extension = int(file_extension.replace(".", ""))
        if file_extension > ext:
            ext = file_extension
            print("extention passe à : ", ext)
        else:
            fichier_supprime.append(filename)
            os.remove(filename)
    print(fichier_supprime)

Salut François,


je ne suis pas sûr d’avoir compris. Dans ton exemple tu ne voudrais garder que le dernier fichier c’est à dire : test_creo.txt.45 ?


Pour ton point 1: python traite les noms de fichier comme des strings. Si tu que windows trie automatiquement je te conseille d’utiliser le padding. Par exemple ton fichier creo_test.txt.1 devrait plutôt s’appeler creo_test.txt.001 comme ça si tu as des fichiers qui vont jusque 999 ils seront déjà triés. Après dans ton script je vois un


sorted(filenames)


donc comme dit plus haut tant que les noms de fichiers ne sont pas triés avec le padding, il ne les classera pas bien et aussi sorted renvoie une liste mais tu n’attribue à aucune variable ce sorted. Soit tu fais un :

sorted_list = sorted(filenames)


sinon tu appliques juste la méthode qui va modifier l’état de ta liste :


filenames.sort()


pour ton point 2 je pense que ça vient du fait que tu dois entrer le path complet du fichier ici tu ne rentres que le nom du fichier.


tu doit faire plutôt:


os.remove(os.path.abspath(filename))

Hello,

oui c'est ca, je veux garder la dernière version .45 et effacer toutes les autres.

Je ne trouve pas où changer les paramètres d'extension dans Windows pour avoir un padding à 3 chiffres alors je test la méthode .zfill() mais je galère pas mal.


En ce qui concerne liste.sort() et liste = sorted(x) effectivement je me mélange encore. après 2 mois j'ai encore pas mal de lacunes.


Pour le path je me suis rendu compte que je ne travaillais pas dans le bon répertoire pour la méthode remove(), j'ai du rappeler le dossier à traiter et ça fonctionne :


os.chdir(dossier.traite)
os.remove(filename)


En fait je m'y prends peut être mal depuis le début, est-il envisageable d'utiliser les dates d'enregistrement d'un fichier dans un dossier pour garder que le fichier le plus récent ? J'ai vu qu'il y avait un module datetime, ce pourrait être un point lors d'un mentorat car je n'ai rien vu dans les formations sur ce module ? ;)

Salut François !


Effectivement tu peux utiliser pour ça le module datetime et le module os.


Voici comment tu pourrais procéder :


Importe le module os et la fonction datetime du module datetime :


import os
from datetime import datetime


Récupère la liste des fichiers du dossier :


files = os.listdir()


Pour chaque fichier de la liste, récupère sa date de modification en utilisant la fonction os.stat() :


for file in files:
    modified_time = os.stat(file).st_mtime


Transforme cette date en objet datetime :


modified_time = datetime.fromtimestamp(modified_time)


Compare la date de modification de chaque fichier à celle du fichier le plus récent jusque-là. Si la date de modification du fichier courant est plus récente, mets à jour la variable latest_file et sa date de modification :


if modified_time > latest_modified_time:
    latest_modified_time = modified_time
    latest_file = file


Une fois que tu as parcouru l'ensemble des fichiers, tu peux supprimer tous les fichiers de la liste, à l'exception du fichier le plus récent :


for file in files:
    if file != latest_file:
        os.remove(file)


Le module datetime est en effet très utile pour manipuler les dates et les heures en Python.


Il te permet par exemple de convertir des dates sous forme de chaîne de caractères au format souhaité, de calculer la différence entre deux dates, etc. Si tu as besoin de plus d'informations sur ce module, n'hésite pas à me poser des questions !


Pour aller plus loin sur le module datetime, on a une formation complète sur le sujet :

https://www.docstring.fr/formations/la-gestion-des-dates-avec-le-module-datetime/


N'hésite pas à utiliser la recherche du site pour trouver ce genre de formations :)

https://www.docstring.fr/recherche/?q=datetime


Je pense que ça te fait déjà pas mal de choses à explorer, bonne continuation !

Inscris-toi

(c'est gratuit !)

Inscris-toi

Tu dois créer un compte pour participer aux discussions.

Créer un compte

Rechercher sur le site

Formulaire de contact

Inscris-toi à Docstring

Pour commencer ton apprentissage.

Tu as déjà un compte ? Connecte-toi.