1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
| #!/usr/bin/env python
# coding: utf-8
import os
import sys
import re
import shutil
# Fonction permettant de découper un nom style "x (nnn)" en "x" et "nnn"
decomp=lambda nom: (
re.sub(r"\([0-9]{1,}\)$", r"", nom).strip(),
int(re.sub(r"^.{1,}\(([0-9]{1,})\)$", r"\1", nom).strip()),
)
# Fonction qui traite un dossier
def crawler(dossier):
# Traitement de chaque fichier du dossier
for f in os.listdir(dossier):
# Si le fichier n'est pas un vrai fichier on le shunte
if not os.path.isfile(os.path.join(dossier, f)): continue
# Récupération de la position du dernier "-" et fichier shunté si pas de "-"
idx=f.rfind("-")
if idx == -1: continue
# Découpage de l'auteur et du titre
(auteur, titre)=(f[0:idx].strip(), f[idx+1:].strip())
# Traitement de tous les sous-dossiers déjà créés
for sousDossier in os.listdir(dossier):
# Si le sous-dossier n'est pas un vrai dossier on le shunte
if not os.path.isdir(os.path.join(dossier, sousDossier)): continue
# Décomposition du sous-dossier en nom+nombre
(subNom, subNombre)=decomp(sousDossier)
# Si le sous-nom est celui de l'auteur on a trouvé
if subNom == auteur: break
else:
# Aucun sous-dossier trouvé => il faudra le créer
# subNombre=0 # Au cas où ça serait utile plus tard
sousDossier="%s (%d)" % (auteur, 0)
os.mkdir(os.path.join(dossier, sousDossier))
# for
# Ok ici tout est prêt - Ne reste qu'à déplacer le fichier dans le sous-dossier (s'il n'existe pas déjà un fichier du même nom !!!)
print(
"Traitement %s => %s" % (
os.path.join(dossier, f),
sousDossier,
)
)
dest=os.path.join(dossier, sousDossier)
try:
shutil.move(
os.path.join(dossier, f),
dest,
)
except shutil.Error as eClass:
# Le fichier déplacé existait déjà !!!
print(
"Copie %s dans %s impossible [%s]" % (
os.path.join(dossier, f),
dest,
eClass,
)
)
else:
# On renomme le sous-dossier en fonction du nombre de fichiers qu'il contient
os.rename(
dest,
os.path.join(
dossier,
"%s (%d)" % (
auteur,
len(os.listdir(dest)),
)
),
)
# try
# for
# crawler()
# Si le programme est lancé directement
if __name__ == "__main__":
for d in sys.argv[1:]:
crawler(d)
# if |