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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé

    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
    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 Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 068
    Par défaut
    en bash ?

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

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

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

    avec une combinaison de
    os.walk et de translate

  4. #4
    Membre éprouvé

    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
    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 éprouvé

    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
    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 émérite
    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
    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 éprouvé

    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
    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
    Membre éprouvé

    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
    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