Bonjour,

je débute tout juste à apprendre la programmation avec Python. J'adore! J'ai testé la création d'un script. Le but est de renommer des fichiers en virant les accents, les caractères spéciaux, etc. L'utilisateur (moi!) lance le script et doit rentrer le chemin du dossier contenant les fichiers qu'on veut renommer. Le script marche nickel, sauf quand ledit dossier a des accents dedans. J'ai passé mon après-midi à chercher comment faire, j'ai testé des tonnes de trucs trouvés sur le net, mais je n'y arrive pas... Le programme se lance, mais quand je donne le chemin (raw_input)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
C:\Users\moi\Desktop\Documents non utilisés
, j'ai ce message:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
Traceback (most recent call last):
  File "C:\Users\moi\Desktop\virer_accent.py", line 38, in <module>
    chemin = chemin.decode('utf-8') # pour remplacer les accents des fichiers
  File "C:\Python27\lib\encodings\utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0x82 in position 43: invalid start byte
Si vous avez une idée, ce serait génial!

merci!

Voilà le script:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
 # -*- coding: utf-8 -*-
import os
import unicodedata
import re
 
print u"\nCe script sert à remplacer:"
print u"- les lettres accentuées par des lettres nons accentuées"
print "- les espaces par des underscores (_)"
print "- les lettres capitales par des lettres minuscules\n"
print u"Les sous-dossiers sont aussi impactés\n"
print "Pour quitter le programme, tapez 'quitter'\n"
print "ATTENTION LE DOSSIER A TRAITER NE DOIT PAS COMPORTER D'ACCENT\n"
 
def suppr_accent_fichiers(chemin):
    for dossier, sous_dossiers, fichiers in os.walk(chemin):   # Boucle sur chaque fichier du dossier chemin et ses sous-dossiers
        for fichier in fichiers:                           # Recupération de tous les noms de fichiers
            nomini= os.path.join(dossier, fichier)
            fichier = unicodedata.normalize('NFD', fichier).encode('ascii', 'ignore')
            fichier = fichier.lower()
            fichier = re.sub('[^a-zA-Z0-9\.]', '_', fichier)   # remplacer tous les caractères spéciaux par underscore
            while "__" in fichier:     # éviter qu'il y ait deux underscores à suivre dans les noms de fichiers
                fichier = fichier.replace ("__", "_")
            os.rename (nomini, os.path.join(dossier, fichier))
    return
 
def suppr_accent_dossiers(chemin):
    for dossier, sous_dossiers, fichiers in os.walk(chemin):   # Boucle sur chaque sous-dossier du dossier chemin
        for sous_dossier in sous_dossiers:                     # Recupération de tous les noms de sous-dossier
            sous_dossierini= os.path.join(dossier, sous_dossier)
            sous_dossier = unicodedata.normalize('NFD', sous_dossier).encode('ascii', 'ignore')
            sous_dossier = sous_dossier.replace (" ", "_")
            sous_dossier = re.sub('[^a-zA-Z0-9 \n\.]', '_', sous_dossier)
            sous_dossier = sous_dossier.lower()
            os.rename (sous_dossierini, os.path.join(dossier, sous_dossier))
    return
 
chemin = raw_input("Quel est le chemin du dossier contenant les fichiers que vous voulez changer: ")
chemin = chemin.decode('utf-8') # pour remplacer les accents des fichiers
if chemin=="quitter":
    quit()
 
while not os.path.exists(chemin):
    print u"Le dossier indiqué n'existe pas"
    chemin = raw_input("Quel est le chemin du dossier contenant les fichiers que vous voulez changer: ")
    chemin = chemin.decode('utf-8') # pour remplacer les accents des fichiers
    if chemin=="quitter":
        break
else:
    print "\nen cours..."
    suppr_accent_fichiers(chemin)
    suppr_accent_dossiers(chemin)
    print u"Le script s'est déroulé avec succès"