Bonsoir,
Utilisant Affa, nous avons constaté la difficulté à restaurer un fichier dont le nom comporte des caractères accentués, des espaces, ...
Pour cela, nous avons mis en place un programme en python qui s'exécute avant la sauvegarde, qui n'a certainement rien d'innovant mais que nous proposons car il est "prêt à utiliser" sur SME.
Ce programme fonctionne bien depuis quelques semaines et envoie à chaque exécution un compte-rendu dans le compte admin.
Je suis à l'écoute de vos remarques.
Bonne lecture.
N.B. : vous pouvez adapter le programme si, par exemple, vous n'êtes pas d'accord pour renommer "St-Bel" en "St_Bel".
Mode d'emploi :
- aller à la fin du programme ;
- remplacer dans les blocs de traitement "nom_de_l_ibay" par le nom de l'ibay sur laquelle vous voulez que le programme travaille ;
- si vous avez des ibays bien remplies et un processeur déjà bien occupé, vous pouvez y aller progressivement en choisissant certains dossiers dans l'ibay et pas toute l'ibay ;
- attention : les sauvegardes vont considérablement augmenter de taille si les noms des répertoires changent tous suite à cette procédure de renommage !
- Code : Tout sélectionner
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import os.path
import re
import sys
import time
import unicodedata
#version du 27 août 2012
def listdirectory(path): # ne sert à rien, pas appelée dans le programme
fichier=[]
for root, dirs, files in os.walk(path):
for i in files:
fichier.append(os.path.join(root, i))
return fichier
#La fonction os.walk(path) crée un générateur de triplets (root, dirs, files) dans l'arborescence de path.
#Un triplet est généré par répertoire visité.
# root représente le chemin d'accès du répertoire visité.
# dirs est la liste des sous-répertoires du répertoire root
# files est la liste des fichiers du répertoire root.
def supprime_espaces_accents_repertoire(ligne):
#supprime les accents et tirets du texte source
#ligne = unicode(ligne, 'ISO-8859-1').encode('UTF-8') #on décode la chaîne d'origine accentuée(ISO8859-1), puis on la passe en UTF8
ligne = ligne.replace('é', 'e')
ligne = ligne.replace('è', 'e')
ligne = ligne.replace('ê', 'e')
ligne = ligne.replace('ë', 'e')
ligne = ligne.replace('à', 'a')
ligne = ligne.replace('ã', 'a')
ligne = ligne.replace('â', 'a')
ligne = ligne.replace('î', 'i')
ligne = ligne.replace('ï', 'i')
ligne = ligne.replace('ô', 'o')
ligne = ligne.replace('ö', 'o')
ligne = ligne.replace('ç', 'c')
ligne = ligne.replace('ù', 'u')
ligne = ligne.replace('û', 'u')
ligne = ligne.replace('ü', 'u')
ligne = ligne.replace('\'', '_')
ligne = ligne.replace('$', '_')
ligne = ligne.replace('&', '_')
ligne = ligne.replace('#', '_')
ligne = ligne.replace('?', '_')
ligne = ligne.replace('!', '_')
ligne = ligne.replace('%', '_')
ligne = ligne.replace('(', '_')
ligne = ligne.replace(')', '_')
ligne = ligne.replace('____', '_')
ligne = ligne.replace('___', '_')
ligne = ligne.replace('__', '_')
ligne = ligne.replace(' ', '_')
ligne = ligne.replace(' - ', '_-_')
ligne = ligne.replace(' -', '_-')
ligne = ligne.replace('- ', '-_')
ligne = ligne.replace('_-', '-')
ligne = ligne.replace('-_', '-')
ligne = ligne.replace('_-_', '-')
ligne = ligne.replace('St-', 'St_')
ligne = ligne.replace('Ste-', 'Ste_')
#ligne = ligne.encode('ISO-8859-1')
#ligne = ligne.encode('utf-8')
return ligne
def renommage_complet_marco(path):
#on travaille en deux temps: d'abord les noms de fichier, puis les noms de répertoire
#renommage ds fichiers: ok pas touche
for root, dirs, files in os.walk(path):
for ancien_nom_fichier in files:
#renommage des fichiers
nouveau_nom_fichier = supprime_espaces_accents_repertoire(ancien_nom_fichier)
if nouveau_nom_fichier != ancien_nom_fichier:
print ""
print "chemin: " + os.path.join(root, "")
print "ancien fichier: " + ancien_nom_fichier
print "nouveau fichier: " + nouveau_nom_fichier
try:
os.rename(os.path.join(root, ancien_nom_fichier) , os.path.join(root, nouveau_nom_fichier))
break
except Exception,e:
print "erreur renommage fichier - verifier doublon"
break
#renommage des répertoires"
modif_faite = "oui"
while modif_faite == "oui":
print "BOUCLE WHILE"
modif_faite = "non"
for root, dirs, files in os.walk(path): #mega gros tableau
list_mon_repertoire_split = root.split(os.sep) #os.sep séparateur systeme /\
#print ""
#print list_mon_repertoire_split
for index in range(len(list_mon_repertoire_split)): #passe d'une case à une autre
#print list_mon_repertoire_split[index]
mon_ancien_chemin_rep = os.sep.join(list_mon_repertoire_split) #on concatène avec "os.sep" = "\"
nouveau_element = supprime_espaces_accents_repertoire(list_mon_repertoire_split[index])
if nouveau_element != list_mon_repertoire_split[index]:
list_mon_repertoire_split[index] = nouveau_element
modif = "oui"
#print "MODIF-MODIF:" + list_mon_repertoire_split[index]
mon_nouveau_chemin_rep = os.sep.join(list_mon_repertoire_split) #on concatène avec "os.sep" = "\"
if mon_ancien_chemin_rep != mon_nouveau_chemin_rep:
print ""
print "ancien repertoire: " +mon_ancien_chemin_rep
print "nouveau repertoire: " +mon_nouveau_chemin_rep
try:
os.rename(mon_ancien_chemin_rep, mon_nouveau_chemin_rep)
modif_faite = "oui"
#print "RENOMMAGE OK"
break
except Exception,e:
print "erreur renommage repertoire - verifier doublon"
break
if __name__ == "__main__":
# 1 - Lister tous les fichiers et répertoires
# 2 - pour chaque répertoire et pour chaque fichier on essaye de remplacer
#"infos systeme"
print "infos systeme"
print "version de python:"
print sys.version_info
mon_time_depart = time.localtime()
print "----------PROGRAMME DE SUPPRESSION DES ACCENTS ET ESPACES------------"
# le chemin entre guillemets est le répertoire à nettoyer.
chemin_archives_1 = "/home/e-smith/files/ibays/nom_de_l_ibay/files/XXXX"
print ""
print ""
print ""
print "-------------------------REPERTOIRE DE TRAVAIL-----------------------------------"
print "Chemin du repertoire: " + chemin_archives_1
print ""
renommage_complet_marco(chemin_archives_1)
chemin_archives_2 = "/home/e-smith/files/ibays/nom_de_l_ibay/files/YYYY"
print ""
print ""
print ""
print "-------------------------REPERTOIRE DE TRAVAIL-----------------------------------"
print "Chemin du repertoire: " + chemin_archives_2
print ""
renommage_complet_marco(chemin_archives_2)
chemin_archives_3 = "/home/e-smith/files/ibays/nom_de_l_ibay/files/ZZZZZ"
print ""
print ""
print ""
print "-------------------------REPERTOIRE DE TRAVAIL--------------------------------------"
print "Chemin du repertoire: " + chemin_archives_3
print ""
renommage_complet_marco(chemin_archives_3)
print ""
print ""
print "depart du script: %s-%s-%s heure: %s:%s:%s " % (mon_time_depart[0],mon_time_depart[1],mon_time_depart[2],mon_time_depart[3],mon_time_depart[4],mon_time_depart[5])
mon_time_fin = time.localtime()
print "fin du script: %s-%s-%s heure: %s:%s:%s " % (mon_time_fin[0],mon_time_fin[1],mon_time_fin[2],mon_time_fin[3],mon_time_fin[4],mon_time_fin[5])