OVH Cloud OVH Cloud

Comment parcourir des sous-répertoires

6 réponses
Avatar
Dan
Bonjour,
Je cherche depuis quelques temps à parcourir un ensemble de répertoires et
sous répertoires pour effectuer des remplacements de caractères accentués par
des caractères sans accents et des caractères vides par des "_". J'ai utilisé
et adapté un script de JCB (excellent) qui permet d'effectuer ces actions sur
un répertoire à la fois - il y a des centaines de répertoires ! - Je
souhaiterais donc parcourir l'ensemble du répertoire principale en une seule
fois mais mes connaissances sont limitées et ma cervelle de piaf ne turbine
pas des masses !
Merci d'avance pour vos conseils.
Dan

6 réponses

Avatar
Do Re Mi chel La Si Do
Bonsoir !

Juste une question : que devra faire ton script, s'il rencontre un fichier
dont le nom est en unicode ?

Je cite ce cas, car j'ai dû, récemment, faire un script similaire : rendre
un ensemble de répertoires et de fichiers compatibles avec le WEB et le FTP.
Et, bien sûr, je suis tombé sur des fichiers en Unicode. Travaillant avec
Python, la solution a été assez facile. Mains, en VBS, j'ai un doute.

@-salutations

Michel Claveau
Avatar
Fred
Dans : news:%,
Do Re Mi chel La Si Do disait :
Bonsoir !


Bonsoir,

... Et, bien sûr, je suis tombé sur des fichiers en
Unicode. Travaillant avec Python, la solution a été assez facile.
Mais, en VBS, j'ai un doute.


Un doute sur quoi ? Le FileSystemObject renvoie bien les noms de fichier
unicode.
En particulier, un :
MsgBox oFile.Name
affiche bien le nom du fichier tel qu'il apparaît dans l'explorateur
Windows.
Si tu parles de la conversion de ce nom de fichier, et qu'il existe sous
Python une fonction de conversion, je suis intéressé pour en connaître
le principe.

Sinon, pour apporter au moins une piste de réponse pour Dan, je dirais
que nous sommes dans le cas d'un problème récursif qui peut se résoudre
avec une procédure du type :

8<-------------
Sub Traitement(oFolder)
For Each oFile In oFolder.Files
Convertir oFile
Next
For Each oSubFolder In oFolder.SubFolders
Traitement oSubFolder
Next
End Sub
8<-------------

La procédure de conversion pourrait ressembler à cela :
8<--------------
Sub Convertir(oFile)
If Instr(oFile.Name, " ")<>0 Then
oFile.Name=Replace(oFile.Name, " ", "_")
End If
'etc .... pour chaque remplacement à effectuer
End Sub
8<--------------


Le programme principal serait alors :

sFolder="C:chemindurépertoireàtraiter"
Set oFSO=CreateObject("Scripting.FileSystemObject")
Traitement oFSO.GetFolder(sFolder)



--
Fred
http://www.cerbermail.com/?3kA6ftaCvT

Avatar
Do Re Mi chel La Si Do
Bonjour !

Renommer un fichier en Unicode, avec Python, est très simple. Il suffit que
le "path" traité soit en Unicode.

Exemple, le script ci-dessous va renommer le premier fichier (rencontré) du
répertoire C:u en lui donnant un nom composé de 3 "N inversé" (caractère
cyrillique n° 1048).
Avec les commentaires, ça devrait rester compréhensible.

@+

Michel Claveau




import os

fic=os.listdir(u'C:u')[0] # on ne va traiter que le fichier fichier [0]
; le u avant le ' indique de l'unicode
nouveaunom=unichr(1048)+unichr(1048)+unichr(1048)+unichr(46) #3 fois le
caractère U+1048, suivi d'un point (46)

anciennomcomplet=u'C:u'+fic #on ajoute le répertoire
nouveaunomcomplet=u'C:u'+nouveaunom #pareil

os.rename(anciennomcomplet,nouveaunomcomplet) #on renomme
Avatar
Do Re Mi chel La Si Do
Re

Pour être plus complet, voici, ci-dessous, une fonction Python qui remplace
les caractères Unicode accentués, par les caractères non accentués.

Cette fonction utilise la "décomposition unicode" des caractères. Dans
Unicode, les caractères accentués sont composés d'un caractère de base,
auquel on ajoute un, ou des, glyphe(s). Le décomposition unicode retourne la
liste des caractères Unicode utilisés, le premier étant le caractère de
base. La fonction interne de Python qui fait cela s'appelle :
unicodedata.decomposition.

Cette fonction, n'est pas de moi, mais je l'ai adoptée, et adaptée.

Michel Claveau





import unicodedata

def enleveAccent(uchaine):
uret=u''
for car in uchaine:
dec = unicodedata.decomposition(car)
if dec:
uret+=unichr(int(dec.split()[0],16))
else:
uret+Êr
return uret

s = u"eêçañël"
print enleveAccent(s)
Avatar
Fred
Dans : news:%23SbfYW$,
Do Re Mi chel La Si Do disait :
Re


Bonsoir,

Pour être plus complet, voici, ci-dessous, une fonction Python qui
remplace les caractères Unicode accentués, par les caractères non
accentués.


Oui, c'est bien à ce type de conversion auquel je pensais. Et là,
effectivement, je ne pense pas que cela peut se faire (directement) en
vbs. Je n'ai pas assez étudié la décomposition des caractères Unicode
pour me rendre compte si on peut faire une fonction analogue à
unicodedata.decomposition(car). Probablement oui. En fait, c'est une
question que j'ai vue sur les groupes consacrés à dotNET : comment
enlever les accents.

Merci pour la piste de recherche :-)


--
Fred
http://www.cerbermail.com/?3kA6ftaCvT

Avatar
Do Re Mi chel La Si Do
Bonsoir !


Attention, la méthode par "décomposition canonique" (je crois que c'est le
terme exact) ne règle pas tout les cas. Et de loin.

Pour avoir quelques idées des problèmes, voir
http://omega.enstb.org/yannis/pdf/docnum.pdf le chapitre 2.3

Disons que ça suffit pour les usages courants, dans nos contrées
occidentales (plus exactement, dans les contrées où sont bien implantées des
sociétés comme Microsoft, Adobe, et autres sponsors du consortium Unicode).


En pratique, la composition canonique est décrite dans des tables. Et ces
données existent forcément dans Windows (avec le nom des caractères Unicode,
etc.) Le tout est de savoir comment y avoir accès...


Bon courage !


@-salutations

Michel Claveau