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 :

Accents, chaînes et Python 3


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 Accents, chaînes et Python 3
    Bonjour,
    voici un code qui me pose problème sous Python 3:
    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
    #! /usr/bin/env python
     
    # Sources :
    #    http://www.developpez.net/forums/d884109/autres-langages/python-zope/general-python/renommer-dossiers-sous-dossiers-fichiers/
    #    http://python.jpvweb.com/mesrecettespython/renommer_mp3
    #    http://python.developpez.com/faq/?page=Fichier#ContenuRepertoire
     
    import glob
    import os.path
     
    dirToClean = "/Users/user/Music/toSort"
    dirForStoring = "/Users/user/Music/namesCleaned"
     
    i_start = len(dirToClean)
     
    # The following variables have been built by  tools_build_variables.py
    UGGLY_CHARACTERS = {'Á': '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', 'ç': 'c', 'æ': 'ae', 'é': 'e', 'è': 'e', 'ë': 'e', 'ê': 'e', 'Ó': 'O', 'ï': 'i', 'î': 'i', 'ñ': 'n', 'Ò': 'O', 'ô': 'o', 'ö': 'o', 'ù': 'u', 'Ÿ': 'Y', 'û': 'u', 'ü': 'u', 'ÿ': 'y'}
    CHARACTERS_ALLOWED = " -_,'0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" + os.sep
     
     
     
    def cleanString(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)
     
        return prettyString
     
     
    def listdirectory(path):
        fichier=[]
        for root, dirs, files in os.walk(path):
            for oneObject in files:
                path = os.path.join(root, oneObject)[i_start:]
                print('path')
                print(path)
                print(cleanString(str(path)))
     
     
    listdirectory(dirToClean)
    Dans le dossier /Users/user/Music/toSort, j'ai le dossier Boby Làpointé avec dedans le fichier .DS_Store.

    Dans une console j'obtiens :
    path
    /Boby Làpointé/.DS_Store
    Traceback (most recent call last):
    File "/Users/user/Documents/myWorld/python/pylonga/clean_files_names/renameFileAndDirectory.py", line 46, in <module>
    listdirectory(dirToClean)
    File "/Users/user/Documents/myWorld/python/pylonga/clean_files_names/renameFileAndDirectory.py", line 43, in listdirectory
    print(cleanString(str(path)))
    File "/Users/user/Documents/myWorld/python/pylonga/clean_files_names/renameFileAndDirectory.py", line 31, in cleanString
    raise ValueError('Unknown character : ' + oneChar + '\nString build : ' + prettyString)
    ValueError: Unknown character : ̀
    String build : /Boby La


    Il est à peu près certain que j'ai un problème d'encodage des chaînes donnant les "paths". Que faire ? Ce que je ne pige pas, c'est que la console me renvoie la chaîne qu'il faudrait analyser alors que la procédure de lecture caractère par caractère fait comme si on avait " à " à la place de " a ̀ ".

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Par défaut
    Je viens de tester ton code sous Windows XP et Python 3.1 en créant un dossier "Boby Làpointé" contenant un fichier ".DS_Store".

    Il se plante sur le point de .DS_Store, ce qui est normal. En ajoutant le point aux caractères autorisés (aucun de tes fichiers n'a d'extension d'habitude ??), cela passe.

    Cela doit donc être spécifique à ta plateforme, qui, à en croire la présence du fichier .DS_Store, est Mac OS X.

    Pourquoi le str dans cleanString(str(path)) ? C'est déjà un string, normalement.

  3. #3
    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 dividee Voir le message
    Je viens de tester ton code sous Windows XP et Python 3.1 en créant un dossier "Boby Làpointé" contenant un fichier ".DS_Store".

    Il se plante sur le point de .DS_Store, ce qui est normal. En ajoutant le point aux caractères autorisés (aucun de tes fichiers n'a d'extension d'habitude ??), cela passe.

    Cela doit donc être spécifique à ta plateforme, qui, à en croire la présence du fichier .DS_Store, est Mac OS X.
    Je testerais en fin de soiré sous Linux...

    Citation Envoyé par dividee Voir le message
    Pourquoi le str dans cleanString(str(path)) ? C'est déjà un string, normalement.
    C'est le désespoir qui me fait faire cela...

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Par défaut
    Essaie peut-être d'appliquer la fonction unicodedata.normalize à ton path:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     path = unicodedata.normalize('NFC',path)
    J'ai trouvé cette info ici; cela devrait te donner un point de départ si cela ne fonctionne toujours pas...

  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
    Super... Tu m'enlèves une épine du pied.

    Je pense que cela doit venir du format de noms étendus utilisés par Mac (je ne connais plus le terme exacte).

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 15/04/2014, 19h44
  2. [Fait]API - Enlever les accents d'une chaîne
    Par cafeine dans le forum Contribuez
    Réponses: 1
    Dernier message: 27/01/2007, 16h48
  3. Accents Command Line depuis un script Python
    Par nicou50 dans le forum Général Python
    Réponses: 6
    Dernier message: 29/12/2006, 10h41
  4. [Chaînes] Supprimer les accents
    Par navis84 dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 17/10/2006, 11h11
  5. Remplacer les accents dans une chaîne
    Par mathieumg dans le forum C
    Réponses: 9
    Dernier message: 23/07/2006, 15h39

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