Chemin d'un dossier avec accent sous windows
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:
C:\Users\moi\Desktop\Documents non utilisés
, j'ai ce message:
Code:
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:
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" |