IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Renommer des dossiers, des sous-dossiers et des fichiers


Sujet :

Python

  1. #1
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut Renommer des dossiers, des sous-dossiers et des fichiers
    Bonjour,
    j'ai, honte à moi, des dossiers utilisant des noms exotiques que je veux changer (je vais surtout faire la chasse à des accents).
    Par exemple, une arborescence de dossiers comme la suivante...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    home
        dossierMalNommé
            unSousDossier_çaVaPas
                fichierEcouté
                fichierAdoré
    devra devenir...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    home
        dossierMalNomme
            unSousDossier_caVaPas
                fichierEcoute
                fichierAdore
    Est-ce que quelqu'un a déjà fait fait cela ?

    Toute info. est la bienvenue.

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 049
    Points : 1 380
    Points
    1 380
    Par défaut
    en bash ?

  3. #3
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Points : 970
    Points
    970
    Par défaut
    bonjour,

    avec une combinaison de
    os.walk et de translate

  4. #4
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    Citation Envoyé par josmiley Voir le message
    en bash ?
    Je veux une solution Python...

    Citation Envoyé par kango Voir le message
    bonjour,

    avec une combinaison de
    os.walk et de translate
    Un petit exemple ?

  5. #5
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    Citation Envoyé par rambc Voir le message
    Un petit exemple ?
    Pas la peine, il y a tout ce qu'il faut dans les deux liens.

    Je posterais une solution ici dans la semaine.

  6. #6
    Membre éclairé
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Points : 773
    Points
    773
    Par défaut
    d'accord pour translate, mais pas d'accord pour os.walk (lent, et et pas économe en mémoire, surtout si c'est pour "chasser" sur un disque entier ^^):
    http://www.developpez.net/forums/d80...ltiple-listes/
    (à lire en entier)

  7. #7
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    D'accord avec toi.

    De plus, il me semble que j'ai eu un souci avec os.walk et les noms de dossier accentués.

    Ma solution va tenir compte de ceci mais je n'aurais pas le temps de "zieuter" cela ce week-end.

  8. #8
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Ce genre de question apparait souvent plus simple qu'elle ne l'est en réalité. Non seulement il faut maitriser les encodages dans tout le code, mais si un nom une fois modifié devient identique à un nom déjà existant, il faut savoir quoi faire (sinon => erreur). Par exemple totoàé et totoaê auront le même nom après suppression des accents. En ce qui me concerne, j'ajoute dans ce cas un ou plusieurs caractère(s) supplémentaire(s) ('_', '$', ...).

    J'ai déjà fait ce genre de code pour préparer une arborescence de fichier musicaux à être correctement reconnue par un lecteur mp3. On peut dans ce cas donner à ce code un caractère plus général, par exemple en transformant les espaces en blancs soulignés et en convertissant tous les caractères interdits sur ce lecteur.

    Voilà en gros ce type de code (vous mettez un répertoire à vous pour essayer!):

    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
     
    #!/usr/bin/python
    # -*- coding:utf-8 -*-
    import os
     
    ##################################################
    def convertaccents(ch,
                     alpha1=u"ÀÂÄàâäÇçÉÈÊËéèêëÎÏîïÔÖôöÙÛÜùûüŸÿ",
                     alpha2=u"AAAaaaCcEEEEeeeeIIiiOOooUUUuuuYy"):
        """dans ch (unicode), remplace les caractères de alpha1 par ceux de
        alpha2
        """
        x = u""
        for c in ch:
            i = alpha1.find(c)
            if i<0: 
                x += c
            else:   
                x += alpha2[i]
        return x
     
    ##################################################
    def renomme(repert, convert=convertaccents, carsup='$'):
        """renomme tous les noms de fichier ou de répertoire avec conversion
        des caractères
        """
        nfs = os.listdir(repert)
        nfsr = []
        for i, nf in enumerate(nfs):
            nf2 = convert(nf)
            while (nf2 in nfsr) or (nf2 in nfs[i+1:]):
                nf2 += carsup
            nfsr.append(nf2)
            nfc = os.path.join(repert, nf2)
            os.rename(os.path.join(repert,nf), nfc)
            if os.path.isdir(nfc):
                renomme(nfc)
     
    ##################################################
     
    rep = r"D:\Python\Pydev\test\testaccents".decode('utf-8')  # rep est en unicode
     
    renomme(rep) 
     
    print u"fini"
    On peut bien entendu modifier comme on le souhaite les 2 chaines de conversion pour s'adapter à ses besoins.

    Pour les "signes diacritiques français" en général, voir ici: http://fr.wikipedia.org/wiki/Diacrit..._fran%C3%A7ais.

    Tyrtamos
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  9. #9
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    J'ai déjà fait ce genre de code pour préparer une arborescence de fichier musicaux à être correctement reconnue par un lecteur mp3.
    J'en connais un qui a du bol car c'est exactement pour ce genre de chose que je voulais un code.

    Je regarde ton code dans la semaine.

    Merci.

  10. #10
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par rambc Voir le message
    J'en connais un qui a du bol car c'est exactement pour ce genre de chose que je voulais un code.
    Dans ce créneau-là, j'ai fait un petit complément: comment renommer les fichiers mp3 en fonction de leurs tags id3... . Cela ne fonctionne pour l'instant que répertoire par répertoire, parce qu'il existe souvent dans les tags des caractères interdits dans les noms de fichiers, et que je n'en ai pas encore la liste complète.

    Voir mon tuto (qui reste à améliorer) ici: http://python.jpvweb.com/mesrecettespython/renommer_mp3.

    Tyrtamos
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  11. #11
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    Dans ce créneau-là, j'ai fait un petit complément: comment renommer les fichiers mp3 en fonction de leurs tags id3... .
    Moi qui croyais que Noël était en décembre...

    Je testerais cela qu'en j'aurais deux ou trois heures devant moi. J'ai pas mal de CD numérisés, plus de 400, donc cela pourra être un bon test.

    Je posterais ici la solution que j'aurais construite à partir de tes codes.

  12. #12
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Dans mon premier projet perso en tkinter (un gestionnaire de fichier sous tux, même pas peur ) j'avais ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class Normalise():
        def ChangeNom(self, AncienNom):
            NouveauNom = unicode(AncienNom, 'UTF-8').replace(' ','_').replace(u'é','e').replace(u'è','e').replace(u'ê','e').replace(u'ë','e').replace(u'æ','ae').replace(u'ã','a').replace(u'ä','a').replace(u'á','a').replace(u'à','a').replace(u'â','a').replace(u'ä','a').replace(u'ù','u').replace(u'ô','o').replace(u'ö','o').replace(u'ç','c').replace(u'ï','i').replace(u'û','u').replace(u'î','i').replace(u'ñ','n').replace(u'À','A').replace(u'Á','A').replace(u'Â','A').replace(u'Ã','A').replace(u'Ä','A').replace(u'Å','A').replace(u'Æ','AE').replace(u'Ç','C').replace(u'È','E').replace(u'É','E').replace(u'Ê','E').replace(u'Ë','E').replace(u'Ñ','N').replace(u'Ì','I').replace(u'Í','I').replace(u'Î','I').replace(u'Ï','I').replace(u'Ï','I').replace(u'Ò','O').replace(u'Ó','O').replace(u'Ô','O').replace(u'Õ','O').replace(u'Ö','O').replace(u'Ü','U').replace(u'Û','U').replace(u'Ú','U').replace(u'Ù','U').replace(u'Œ','OE').replace(u'œ','oe')
            return NouveauNom.lower()
    Cela fais mal aux yeux mais fonctionne
    Merci d'utiliser le forum pour les questions techniques.

  13. #13
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Citation Envoyé par PauseKawa Voir le message
    Cela fais mal aux yeux mais fonctionne
    Effectivement , mais je retiens l'idée pour des caractères comme 'œ' ou 'æ', puisqu'il s'agit alors de remplacer un seul caractère par 2, ce qui compliquerait un peu ma solution.

    Merci!

    Tyrtamos
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  14. #14
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    Voilà ce que j'ai pondu pour Python 3. C'est pour un usage perso. donc il y a sûrement des points à améliorer.
    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
    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
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    #! /usr/bin/env python
     
    import unicodedata
    import os.path
    import glob
    import shutil
     
     
    dirToClean = "/Users/my_login/Music/for_me/toRename"
    dirForStoring = "/Users/my_login/Music/for_me/namesCleaned"
    extensionToKeep = ['mp3']
     
    i_clean = len(dirToClean)
     
    THE_DIRECTORIES_ANALYSED = []
     
    # The following variables have been built by  tools_build_variables.py
    UGGLY_CHARACTERS = {'ì': 'i', 'ò': 'o', 'º': '°', 'Á': 'A', 'À': 'A', 'Ã': 'A', 'Â': 'A', 'Å': 'A', 'Ä': 'A', 'Ç': 'C', 'Æ': 'AE', 'É': 'E', 'È': 'E', 'Ë': 'E', 'Ê': 'E', 'Í': 'I', 'Ì': 'I', 'Ï': 'I', 'Î': 'I', 'Ñ': 'N', 'œ': 'oe', 'Œ': 'OE', 'Õ': 'O', 'Ô': 'O', 'Ö': 'O', 'Ù': 'U', 'Û': 'U', 'Ú': 'U', 'Ü': 'U', 'á': 'a', 'à': 'a', 'ã': 'a', 'â': 'a', 'å': 'a', 'ä': 'a', 'ç': 'c', 'æ': 'ae', 'é': 'e', 'è': 'e', 'ë': 'e', 'ê': 'e', 'í': 'i', 'Ó': 'O', 'ï': 'i', 'î': 'i', 'ñ': 'n', 'ó': 'o', 'Ò': 'O', 'õ': 'o', 'ô': 'o', 'ö': 'o', 'ù': 'u', 'Ÿ': 'Y', 'û': 'u', 'ú': 'u', 'ü': 'u', 'ÿ': 'y'}
    CHARACTERS_ALLOWED = " .-_,'/!°(){}[]&\\0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" + os.sep
     
    def cleanString(stringToClean):
    # The following tip has been found here :
    #    http://www.developpez.net/forums/d907089/autres-langages/python-zope/general-python/accents-chaines-python-3-a/
        stringToClean = unicodedata.normalize('NFC', stringToClean)
     
        prettyString = ''
     
        for oneChar in stringToClean:
            if oneChar in UGGLY_CHARACTERS:
                prettyString += UGGLY_CHARACTERS[oneChar]
            elif oneChar in CHARACTERS_ALLOWED:
                prettyString += oneChar
            else:
                raise ValueError('Unknown character : ' + oneChar+ \
                                '\nString build : ' + prettyString+ \
                                '\nString to clean: ' + stringToClean)
     
        return prettyString
     
     
    def giveThePathOfTheStoringDir(pathAnalysed):
    # If we have
    #    dirToClean = "/Users/my_login/Music/for_me/toSort"
    # and
    #    dirForStoring = "/Users/my_login/Music/for_me/namesCleaned"
    # then this function changes
    #    "/Users/my_login/Music/for_me/toSort/path..."
    # to
    #    "/Users/my_login/Music/for_me/namesCleaned/path..."
        return dirForStoring + pathAnalysed[i_clean:]
     
    def buildNewDir(pathOfTheDir):
    # Source :
    #    http://python.developpez.com/faq/?page=Repertoire#mkDir
        if not os.path.isdir(pathOfTheDir):
            os.makedirs(pathOfTheDir)
     
     
    def buildFile(pathOfTheOldFile,pathOfTheStoringDir):
        baseName = cleanString(os.path.basename(pathOfTheOldFile))
        pathOfTheNewFile = pathOfTheStoringDir + os.sep + baseName
     
        shutil.copy2(pathOfTheOldFile,
                     pathOfTheNewFile)
     
    def contentOfOneDirectory(pathOfTheDirTotreat):
    # Source :
    #    http://python.developpez.com/faq/?page=Fichier#ContenuRepertoire
        pathOfTheStoringDir = giveThePathOfTheStoringDir(pathOfTheDirTotreat)
        pathOfTheStoringDir = cleanString(pathOfTheStoringDir)
     
        THE_DIRECTORIES_ANALYSED.append(pathOfTheStoringDir)
     
        print(pathOfTheDirTotreat)
     
        thePathsFound = glob.glob(pathOfTheDirTotreat+'/*')
     
        for onePath in thePathsFound:
            if os.path.isdir(onePath):
                contentOfOneDirectory(onePath)
            else:
    # Link : http://docs.python.org/library/os.path.html?highlight=os.path#os.path.splitext
                fileExtension = os.path.splitext(onePath)[1][1:]
                fileExtension = fileExtension.lower()
     
                if fileExtension in extensionToKeep:
                    buildNewDir(pathOfTheStoringDir)
                    buildFile(onePath, pathOfTheStoringDir)
     
    # We launch the main method
    contentOfOneDirectory(dirToClean)
    print('='*40)
     
    # We indicate the directories with no output, maybe because of a bug of my method...
    dirWithNoOutput = []
    for onePath in THE_DIRECTORIES_ANALYSED:
        if not os.path.isdir(onePath):
            dirWithNoOutput.append(onePath)
     
    if dirWithNoOutput:
        if len(dirWithNoOutput)==1:
            startOfTheMessage = "The following cleaned path has"
        else:
            startOfTheMessage = "The following cleaned paths have"
     
        print("""
    """ + startOfTheMessage + """ no audio files from the point of view of this script (this can be the consequence of a strange name of a directory) :""")
        for i, value in enumerate(dirWithNoOutput):
            print('\t' + str(value))
    Voici le fichier utilisé pour contruire les variables UGGLY_CHARACTERS et CHARACTERS_ALLOWED :
    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
    #! /usr/bin/env python
     
    import string
     
    UGGLY_CHARACTERS_DEF = {
        'A': "ÁÀÂÄÃÅ",
        'a': "áàâäãå",
        'ae': "æ",
        'AE': "Æ",
        'C': "Ç",
        'c': "ç",
        'E': "ÉÈÊË",
        'e': "éèêë",
        'I': "ÍÌÎÏ",
        'i': "íìîï",
        'n': "ñ",
        'N': "Ñ",
        'O': "ÓÒÔÖÕ",
        'o': "óòôöõ",
        'oe': "œ",
        'OE': "Œ",
        'U': "ÚÙÛÜ",
        'u': "úùûü",
        'Y': "Ÿ",
        'y': "ÿ",
        '°': "º",
                       }
     
    UGGLY_CHARACTERS = {}
     
    for oneChar in UGGLY_CHARACTERS_DEF:
        for oneUgglyChar in UGGLY_CHARACTERS_DEF[oneChar]:
            UGGLY_CHARACTERS[oneUgglyChar] = oneChar
     
    print('UGGLY_CHARACTERS = ' + str(UGGLY_CHARACTERS))
     
    CHARACTERS_ALLOWED = " .-_,'/!°(){}[]" + "\\"*2
     
    for oneAlpha in string.digits + string.ascii_lowercase + string.ascii_uppercase:
        CHARACTERS_ALLOWED += oneAlpha
     
    print('CHARACTERS_ALLOWED = "' + CHARACTERS_ALLOWED +'" + os.sep')
    J'ai un dossier qui se nomme Southport Weekender Vol 7 Mixed By Jazzanova [Japan] [Disc 1] et qui pose problème. Quelqu'un voit-il pourquoi ?

  15. #15
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    Citation Envoyé par rambc Voir le message
    J'ai un dossier qui se nomme Southport Weekender Vol 7 Mixed By Jazzanova [Japan] [Disc 1] et qui pose problème. Quelqu'un voit-il pourquoi ?
    Oui. Moi...

    Ce sont les crochets qui ne sont pas aimés par glob . Je vais essayer une autre méthode de parcours des dossiers. Si cela marche, je posterais ici.

  16. #16
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    Cette nouvelle version devrait fonctionner avec des noms bizzares de dossiers. A tester...

    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
    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
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    #! /usr/bin/env python
     
    import unicodedata
    import os.path
    import glob
    import shutil
     
     
    dirToClean = "/Users/my_login/Music/for_me/toRename"
    dirForStoring = "/Users/my_login/Music/for_me/namesCleaned"
    extensionToKeep = ['mp3']
     
    i_clean = len(dirToClean)
     
    THE_DIRECTORIES_ANALYSED = []
     
    # The following variables have been built by  tools_build_variables.py
    UGGLY_CHARACTERS = {'ì': 'i', 'ò': 'o', 'º': '°', 'Á': 'A', 'À': 'A', 'Ã': 'A', 'Â': 'A', 'Å': 'A', 'Ä': 'A', 'Ç': 'C', 'Æ': 'AE', 'É': 'E', 'È': 'E', 'Ë': 'E', 'Ê': 'E', 'Í': 'I', 'Ì': 'I', 'Ï': 'I', 'Î': 'I', 'Ñ': 'N', 'œ': 'oe', 'Œ': 'OE', 'Õ': 'O', 'Ô': 'O', 'Ö': 'O', 'Ù': 'U', 'Û': 'U', 'Ú': 'U', 'Ü': 'U', 'á': 'a', 'à': 'a', 'ã': 'a', 'â': 'a', 'å': 'a', 'ä': 'a', 'ç': 'c', 'æ': 'ae', 'é': 'e', 'è': 'e', 'ë': 'e', 'ê': 'e', 'í': 'i', 'Ó': 'O', 'ï': 'i', 'î': 'i', 'ñ': 'n', 'ó': 'o', 'Ò': 'O', 'õ': 'o', 'ô': 'o', 'ö': 'o', 'ù': 'u', 'Ÿ': 'Y', 'û': 'u', 'ú': 'u', 'ü': 'u', 'ÿ': 'y'}
    CHARACTERS_ALLOWED = " .-_,'/!°(){}[]&\\0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" + os.sep
     
    def cleanString(stringToClean):
    # The following tip has been found here :
    #    http://www.developpez.net/forums/d907089/autres-langages/python-zope/general-python/accents-chaines-python-3-a/
        stringToClean = unicodedata.normalize('NFC', stringToClean)
     
        prettyString = ''
     
        for oneChar in stringToClean:
            if oneChar in UGGLY_CHARACTERS:
                prettyString += UGGLY_CHARACTERS[oneChar]
            elif oneChar in CHARACTERS_ALLOWED:
                prettyString += oneChar
            else:
                raise ValueError('Unknown character : ' + oneChar+ \
                                '\nString build : ' + prettyString+ \
                                '\nString to clean: ' + stringToClean)
     
        return prettyString
     
     
    def giveThePathOfTheStoringDir(pathAnalysed):
    # If we have
    #    dirToClean = "/Users/my_login/Music/for_me/toSort"
    # and
    #    dirForStoring = "/Users/my_login/Music/for_me/namesCleaned"
    # then this function changes
    #    "/Users/my_login/Music/for_me/toSort/path..."
    # to
    #    "/Users/my_login/Music/for_me/namesCleaned/path..."
        return dirForStoring + pathAnalysed[i_clean:]
     
    def buildNewDir(pathOfTheDir):
    # Source :
    #    http://python.developpez.com/faq/?page=Repertoire#mkDir
        if not os.path.isdir(pathOfTheDir):
            os.makedirs(pathOfTheDir)
     
     
    def buildFile(pathOfTheOldFile, pathOfTheStoringDir):
        baseName = cleanString(os.path.basename(pathOfTheOldFile))
        pathOfTheNewFile = pathOfTheStoringDir + os.sep + baseName
     
        shutil.copy2(pathOfTheOldFile,
                     pathOfTheNewFile)
     
    def contentOfOneDirectory(pathOfTheDirTotreat):
        for root, dirs, files in os.walk(pathOfTheDirTotreat):
            if files:
                pathOfTheStoringDir = giveThePathOfTheStoringDir(root)
                pathOfTheStoringDir = cleanString(pathOfTheStoringDir)
     
                THE_DIRECTORIES_ANALYSED.append(pathOfTheStoringDir)
     
                print(root)
     
                for oneFile in files:
    # Link : http://docs.python.org/library/os.path.html?highlight=os.path#os.path.splitext
                    fileExtension = os.path.splitext(oneFile)[1][1:]
                    fileExtension = fileExtension.lower()
     
                    if fileExtension in extensionToKeep:
                        buildNewDir(pathOfTheStoringDir)
                        buildFile(root + os.sep + oneFile, pathOfTheStoringDir)
     
    # We launch the main method
    contentOfOneDirectory(dirToClean)
    print('='*40)
     
    # We indicate the directories with no output, maybe because of a bug of my method...
    dirWithNoOutput = []
    for onePath in THE_DIRECTORIES_ANALYSED:
        if not os.path.isdir(onePath):
            dirWithNoOutput.append(onePath)
     
    if dirWithNoOutput:
        if len(dirWithNoOutput)==1:
            startOfTheMessage = "The following cleaned path has"
        else:
            startOfTheMessage = "The following cleaned paths have"
     
        print("""
    """ + startOfTheMessage + """ no audio files from the point of view of this script (this can be the consequence of a strange name of a directory) :""")
        for i, value in enumerate(dirWithNoOutput):
            print('\t' + str(value))

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Supprimer des sous-dossier d'un dossier (loop)
    Par Rodman_ dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 27/03/2012, 20h06
  2. Réponses: 1
    Dernier message: 31/12/2011, 10h31
  3. [1.x] Créer des sous-dossiers dans les dossiers de templates
    Par cmasset dans le forum Symfony
    Réponses: 2
    Dernier message: 24/09/2009, 18h21
  4. Réponses: 3
    Dernier message: 22/03/2007, 18h40
  5. [C#] Prendre des droits sur des dossiers et sous dossiers
    Par raf_unl dans le forum Windows Forms
    Réponses: 4
    Dernier message: 19/03/2007, 13h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo