Trieur de fichier
Bonsoir,
Je crois que je suis un peu à la ramasse...
Je n'arrive pas à faire le trieur de fichier.
Je suis un peu découragé :s et j'aime pas ça lol
Je tri mes fichiers par extension dans des listes.
Et je voudrais déplacer ensuite les fichiers de ces listes dans les dossiers que j'ai créé à la fin de mon script.
Mais je ne comprends absolument pas comment on déplace avec rename. Même en regardant sur internet....
J'ai tout faux ou je tiens qqchose ?
Comment intégrer le rename dans mes conditions à la fin du cript ?
Merci
"""
mp3 wav flac : Musique
avi mp4 gif : Videos
bmp png jpg : Images
txt pptx csv xls odp pages : Documents
autres : Divers
"""
import pathlib
dossier_a_trier = pathlib.Path(r"C:\Users\gabri\OneDrive\Documents\python\Docstring\formation_avancee\data")
musique = []
videos = []
images = []
documents = []
divers = []
for fichier in dossier_a_trier.iterdir():
if fichier.suffix == ".mp3" or fichier.suffix == ".wav" or fichier.suffix == ".flac":
musique.append(fichier)
elif fichier.suffix == ".avi" or fichier.suffix == ".mp4" or fichier.suffix == ".gif":
videos.append(fichier)
elif fichier.suffix == ".bmp" or fichier.suffix == ".png" or fichier.suffix == ".jpg":
images.append(fichier)
elif fichier.suffix == ".txt" or fichier.suffix == ".pptx" or fichier.suffix == ".csv" or fichier.suffix == ".xls" or fichier.suffix == ".odp" or fichier.suffix == ".pages":
documents.append(fichier)
else:
divers.append(fichier)
if musique:
pathlib.Path(dossier_a_trier, "Musique").mkdir(exist_ok=True)
if videos:
pathlib.Path(dossier_a_trier, "Videos").mkdir(exist_ok=True)
if images:
pathlib.Path(dossier_a_trier, "Images").mkdir(exist_ok=True)
if documents:
pathlib.Path(dossier_a_trier, "Documents").mkdir(exist_ok=True)
if divers:
pathlib.Path(dossier_a_trier, "Divers").mkdir(exist_ok=True)
Salut Gabriel,
Tu tiens le bon bout, tu a juste mélangé quelques trucs mais c'est tout à fait normal quand on commence à écrire des scripts qui deviennent de plus en plus long. Dans ces moments, je te conseille d'isoler le morceau qui pose problème et d'essayer de le faire dans un autre script avec un cas de figure précis, en enlevant toutes les autres conditions.
La première partie de ton script est bonne : tu récupères les fichiers selon leur extension dans une liste.
Tu vérifies ensuite si les listes contiennent des entrées pour ne pas créer de dossiers vide, là aussi c'est bon.
La façon dont tu as fait ton script actuellement, il va falloir que tu boucles de nouveau sur tes listes pour pouvoir récupérer chaque fichier individuellement et le déplacer :
if musique:
pathlib.Path(dossier_a_trier, "Musique").mkdir(exist_ok=True)
for file in musique:
# Ici tu dois faire le déplacement
pass
Pour déplacer un fichier tu peux utiliser la méthode rename de la classe Path :
https://docs.python.org/fr/3/library/pathlib.html#pathlib.Path.rename
C'est là que je te dis qu'il faut essayer de faire cela en dehors de ton script pour t'assurer de bien comprendre déjà comment cette méthode fonctionne sans inclure d'autres variables qui pourraient t'induire en erreur.
Du coup tu peux faire un test avec un fichier tout simple que tu déplaces, par exemple :
from pathlib import Path
fichier_original = Path("/Users/Thibh/Documents/fichier_origine.txt")
fichier_original.rename("/Users/Thibh/Documents/musique/fichier_origine.txt")
La plus grosse difficulté ici ça sera de créer le chemin de destination à partir de tout ce que tu as actuellement. Il faudra donc faire de la concaténation de chemin entre le chemin du dossier, le nom du fichier. Tu as heureusement beaucoup de méthodes qui existent avec pathlib pour réaliser ceci, je te laisse revoir tout ça :
https://www.docstring.fr/blog/gerer-des-chemins-de-fichiers-avec-pathlib/
Vas y étape par étape et essaie d'isoler les différentes parties du script :)
Il me reste un dernier problème. J'étais sûr que ça allait fonctionner mince !
Dans le dossier divers je n'ai qu'une partie des fichiers qui se trie mais après j'ai cette erreur :
Et ci-dessous mon code :
"""
mp3 wav flac : Musique
avi mp4 gif : Videos
bmp png jpg : Images
txt pptx csv xls odp pages : Documents
autres : Divers
"""
import pathlib
dossier_a_trier = pathlib.Path(r"C:\Users\gabri\OneDrive\Documents\python\Docstring\formation_avancee\data")
musique = []
videos = []
images = []
documents = []
divers = []
for fichier in dossier_a_trier.iterdir():
if fichier.suffix == ".mp3" or fichier.suffix == ".wav" or fichier.suffix == ".flac":
musique.append(fichier)
elif fichier.suffix == ".avi" or fichier.suffix == ".mp4" or fichier.suffix == ".gif":
videos.append(fichier)
elif fichier.suffix == ".bmp" or fichier.suffix == ".png" or fichier.suffix == ".jpg":
images.append(fichier)
elif fichier.suffix == ".txt" or fichier.suffix == ".pptx" or fichier.suffix == ".csv" or fichier.suffix == ".xls" or fichier.suffix == ".odp" or fichier.suffix == ".pages":
documents.append(fichier)
else:
divers.append(fichier)
if musique:
pathlib.Path(dossier_a_trier, "Musique").mkdir(exist_ok=True)
dossier_musique = pathlib.Path(r"C:\Users\gabri\OneDrive\Documents\python\Docstring\formation_avancee\data\Musique")
for file in musique:
file.rename(dossier_musique / file.name)
if videos:
pathlib.Path(dossier_a_trier, "Videos").mkdir(exist_ok=True)
dossier_video = pathlib.Path(r"C:\Users\gabri\OneDrive\Documents\python\Docstring\formation_avancee\data\Videos")
for file in videos:
file.rename(dossier_video / file.name)
if images:
pathlib.Path(dossier_a_trier, "Images").mkdir(exist_ok=True)
dossier_images = pathlib.Path(r"C:\Users\gabri\OneDrive\Documents\python\Docstring\formation_avancee\data\Images")
for file in images:
file.rename(dossier_images / file.name)
if documents:
pathlib.Path(dossier_a_trier, "Documents").mkdir(exist_ok=True)
dossier_documents = pathlib.Path(r"C:\Users\gabri\OneDrive\Documents\python\Docstring\formation_avancee\data\Documents")
for file in documents:
file.rename(dossier_documents / file.name)
if divers:
pathlib.Path(dossier_a_trier, "Divers").mkdir(exist_ok=True)
dossier_divers = pathlib.Path(r"C:\Users\gabri\OneDrive\Documents\python\Docstring\formation_avancee\data\Divers")
for file in divers:
file.rename(dossier_divers / file.name)
Salut Gabriel,
juste pour être sûr : c'est un autre problème après notre discussion pendant le live hier soir ?
Je n'ai pas fais le test car il me faudra toute ton arborescence de fichier mais je pense que ça vient de ce que tu mets dans "divers" . En fait au début du script tu mets tout ce qui n'est pas dans les extensions mais peut être faut il au moins s'assurer que c'est un fichier.
divers = []
for fichier in dossier_a_trier.iterdir():
...
else:
divers.append(fichier)
je pense que dans divers, tu vas te retrouver avec aussi des sous dossiers de dossier_a_trier car tu ne mets pas de condition pour dire si c'est u fichier ou un dossier. Essaye de rajouter une condition au lieu de else qui va prendre tout ce qu'il reste et remplace le par un elif avec un test si c'est un fichier ou dossier.
Merci PA !
J'ai gardé mon else mais j'ai imbriqué un if is.file() dedans !
Du coup vous pensez quoi de mon script final ? Avant que je regarde la correction lol
J'ai testé tout est trié dans les bons dossiers.
"""
mp3 wav flac : Musique
avi mp4 gif : Videos
bmp png jpg : Images
txt pptx csv xls odp pages : Documents
autres : Divers
"""
import pathlib
dossier_a_trier = pathlib.Path(r"C:\Users\gabri\OneDrive\Documents\python\Docstring\formation_avancee\data")
musique = []
videos = []
images = []
documents = []
divers = []
for fichier in dossier_a_trier.iterdir():
if fichier.suffix == ".mp3" or fichier.suffix == ".wav" or fichier.suffix == ".flac":
musique.append(fichier)
elif fichier.suffix == ".avi" or fichier.suffix == ".mp4" or fichier.suffix == ".gif":
videos.append(fichier)
elif fichier.suffix == ".bmp" or fichier.suffix == ".png" or fichier.suffix == ".jpg":
images.append(fichier)
elif fichier.suffix == ".txt" or fichier.suffix == ".pptx" or fichier.suffix == ".csv" or fichier.suffix == ".xls" or fichier.suffix == ".odp" or fichier.suffix == ".pages":
documents.append(fichier)
else:
if fichier.is_file():
divers.append(fichier)
if musique:
pathlib.Path(dossier_a_trier, "Musique").mkdir(exist_ok=True)
dossier_musique = pathlib.Path(r"C:\Users\gabri\OneDrive\Documents\python\Docstring\formation_avancee\data\Musique")
for file in musique:
file.rename(dossier_musique / file.name)
if videos:
pathlib.Path(dossier_a_trier, "Videos").mkdir(exist_ok=True)
dossier_video = pathlib.Path(r"C:\Users\gabri\OneDrive\Documents\python\Docstring\formation_avancee\data\Videos")
for file in videos:
file.rename(dossier_video / file.name)
if images:
pathlib.Path(dossier_a_trier, "Images").mkdir(exist_ok=True)
dossier_images = pathlib.Path(r"C:\Users\gabri\OneDrive\Documents\python\Docstring\formation_avancee\data\Images")
for file in images:
file.rename(dossier_images / file.name)
if documents:
pathlib.Path(dossier_a_trier, "Documents").mkdir(exist_ok=True)
dossier_documents = pathlib.Path(r"C:\Users\gabri\OneDrive\Documents\python\Docstring\formation_avancee\data\Documents")
for file in documents:
file.rename(dossier_documents / file.name)
if divers:
pathlib.Path(dossier_a_trier, "Divers").mkdir(exist_ok=True) #debug ici
dossier_divers = pathlib.Path(r"C:\Users\gabri\OneDrive\Documents\python\Docstring\formation_avancee\data\Divers")
for file in divers:
file.rename(dossier_divers / file.name)
Inscris-toi
(c'est gratuit !)
Tu dois créer un compte pour participer aux discussions.
Créer un compte