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 :

Ouvrir un répertoire avec accent dans le path


Sujet :

Python

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2002
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 72
    Points : 59
    Points
    59
    Par défaut Ouvrir un répertoire avec accent dans le path
    Bonsoir à tous,

    je cherche à faire un truc normalement tout bête :

    ouvrir un répertoire sur un lecteur avec un accent dans le chemin. (windows !)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            if sys.platform=='win32':
                the_path = 'Z:\\Mon chemin accentué\\mon sous dossier'
                subprocess.Popen('explorer "%s"' % the_path)
            else:
                # pour linux .....
    si mon chemin est sans accents ça marche, sinon rien !!

    Quelqu'un aurait-il eu le cas ou une petite idée à creuser ?

    Merci bien

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 480
    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 480
    Points : 9 277
    Points
    9 277
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    C'est un problème d'encodage du chemin.

    Imaginons que tu travailles dans ta page de code Python en 'utf-8':

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    the_path = r"C:\Users\tyrtamos\Documents\Courrier Privé\abcéèçàùôï".decode('utf-8').encode('cp1252')
    le r"..." permet de ne pas interpréter les '\', et donc de copier-coller les chemins sans avoir à doubler ('\\')

    le .decode('utf-8') convertit en unicode la chaine initialement encodée en utf-8

    le .encode('cp1252') encode la chaine unicode en 'cp1252' qui est l'encodage Windows.

    Je viens d'essayer, et ça marche chez moi (Win 7). J'ai même créé le répertoire "abcéèçàùôï" à cette occasion .

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2002
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 72
    Points : 59
    Points
    59
    Par défaut
    Alors là je dis génial .... le forum et merci tyrtamos

    ça fonctionne nickel ! merci beaucoup

    PS. : joli nom de répertoire "abcéèçàùôï"

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 93
    Points : 49
    Points
    49
    Par défaut
    Bonjour.

    J'ai essayé de suivre vos conseils: j'ai copier un script qui crée une petit fenêtre avec Tkinter et qui permet d'ouvrir l'explorateur pour choisir un répertoire.
    Je souhaite modifier le répertoire par défaut, mais j'ai un problème lorsque le chemin contient des caractères accentués.

    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
     
    # -*-coding:Latin-1 -*
     
    import tkinter
    import tkinter.filedialog
     
    def choixrep():
        global rep
        the_path = r"D:\Mes documents\Maths\
            \DEA\Mémoire".decode('latin-1').encode('cp1252')
        rep = tkinter.filedialog.askdirectory(initialdir=the_path,\
            title='Choisissez un repertoire')
        if len(rep) > 0:
            print("vous avez choisi le repertoire ",rep)
     
     
    fen1 = tkinter.Tk()
    tex1 = tkinter.Label(fen1, text='Répertoire des sources')
    tex1.pack()
     
    rep =''
    btnchoixrep = tkinter.Button(fen1, text='Votre choix', command = choixrep)
    btnchoixrep.pack()
     
    btnquitter = tkinter.Button(fen1, text='Quitter', command = fen1.destroy)
    btnquitter.pack()
    fen1.mainloop()
    Python me retourne que les chaines n'ont pas d'attributs decode.
    Pouvez-vous m'aider ? (je suis sous seven 64 bits).

  5. #5
    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,

    Le code présenté était pour Python 2.x.
    Pas besoin du decode().encode() sous Python 3

    @+

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 93
    Points : 49
    Points
    49
    Par défaut
    Pourtant, il ne fonctionne pas. Si j'écris
    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
     
    # -*-coding:Latin-1 -*
     
    import tkinter
    import tkinter.filedialog
     
    def choixrep():
        global rep
        the_path = r"D:\Mes documents\Maths\DEA\Mémoire"
        rep = tkinter.filedialog.askdirectory(initialdir=the_path,\
            title='Choisissez un repertoire')
        if len(rep) > 0:
            print("vous avez choisi le repertoire ",rep)
     
     
    fen1 = tkinter.Tk()
    tex1 = tkinter.Label(fen1, text='Répertoire des sources')
    tex1.pack()
     
    rep =''
    btnchoixrep = tkinter.Button(fen1, text='Votre choix', command = choixrep)
    btnchoixrep.pack()
     
    btnquitter = tkinter.Button(fen1, text='Quitter', command = fen1.destroy)
    btnquitter.pack()
    fen1.mainloop()
    le répertoire par défaut n'est pas Mémoire ; le fenêtre ouvre sur le répertoire utilisateur. En revanche, si je m'arrête à DEA, ça fonctionne (dans la ligne dossier, il est écrit DEA, mais je dois descendre l’ascenseur pour le voir dans l'arborescence).

  7. #7
    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
    Tout simplement car vous spécifiez l'encodage

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 93
    Points : 49
    Points
    49
    Par défaut
    C'est inutile parce qu'il s'agit de Python 3 ?

    J'ai enlevé l'encodage, mais ça ne change rien.

  9. #9
    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
    Et D:\Mes documents\Maths\DEA\Mémoire existe ?
    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
    import tkinter
    import os
     
     
    def choixrep():
        global rep
        the_path = "D:\Mes documents\Maths\DEA\Mémoire"
        if os.path.isdir(the_path):
            rep = tkinter.filedialog.askdirectory(initialdir=the_path,
                                                  title='Choisissez un répertoire')
            if len(rep) > 0:
                print("vous avez choisi le répertoire ",rep)
     
    fen1 = tkinter.Tk()
    tkinter.Label(fen1, text='Répertoire des sources').pack()
    tkinter.Button(fen1, text='Votre choix', command=choixrep).pack()
    tkinter.Button(fen1, text='Quitter', command=fen1.destroy).pack()
    fen1.mainloop()

  10. #10
    Membre éprouvé

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Points : 1 273
    Points
    1 273
    Par défaut
    Le ne concerne que l’encodage du fichier lui-même, pas les str. À noter que sans lui, py3 assume que votre code est en utf-8, me semble-t-il…

    Bref, s’il n’est effectivement plus nécessaire d’utiliser .decode(), the_path étant déjà en unicode (les str de py3 sont toujours unicode), je gage que le .encode("cp1252") est toujours nécessaire, lui, windows n’étant toujours pas full-utf-8…

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 93
    Points : 49
    Points
    49
    Par défaut
    J'ai essayé ce code, même résultat.
    Le répertoire existe.
    Si je choisis DEA comme répertoire par défaut et que je sélectionne ensuite Mémoire, il renvoie bien le chemin d'accès choisis.
    Merci pour votre aide.

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 93
    Points : 49
    Points
    49
    Par défaut
    Citation Envoyé par mont29 Voir le message
    Le ne concerne que l’encodage du fichier lui-même, pas les str. À noter que sans lui, py3 assume que votre code est en utf-8, me semble-t-il…

    Bref, s’il n’est effectivement plus nécessaire d’utiliser .decode(), the_path étant déjà en unicode (les str de py3 sont toujours unicode), je gage que le .encode("cp1252") est toujours nécessaire, lui, windows n’étant toujours pas full-utf-8…
    Merci beaucoup, ça fonctionne ! Je commence en Python, je n'avais pas fait l'essai. Il faut que je me mette au clair avec ces questions d'encodage.

    Encore merci à vous deux.

  13. #13
    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 mont29,

    Citation Envoyé par mont29 Voir le message
    Le ne concerne que l’encodage du fichier lui-même, pas les str. À noter que sans lui, py3 assume que votre code est en utf-8, me semble-t-il…

    Bref, s’il n’est effectivement plus nécessaire d’utiliser .decode(), the_path étant déjà en unicode (les str de py3 sont toujours unicode), je gage que le .encode("cp1252") est toujours nécessaire, lui, windows n’étant toujours pas full-utf-8…
    Tout cela nous mène à l'encodage de la console.
    Sur mon système, qui est en UTF-8, si je mets le coding en Latin-1 le code suivant ne fonctionne pas
    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
    # -*-coding:Latin-1 -*
    #
    #
    #
    import tkinter
    import tkinter.filedialog
    import os
     
     
    def choixrep():
        global rep
        the_path = "/home/patrice/Bureau/à"
        if os.path.isdir(the_path):
            rep = tkinter.filedialog.askdirectory(initialdir=the_path,
                                                  title='Choisissez un répertoire')
            if len(rep) > 0:
                print("vous avez choisi le répertoire ",rep)
     
    fen1 = tkinter.Tk()
    tkinter.Label(fen1, text='Répertoire des sources').pack()
    tkinter.Button(fen1, text='Votre choix', command=choixrep).pack()
    tkinter.Button(fen1, text='Quitter', command=fen1.destroy).pack()
    fen1.mainloop()
    Un simple # -*-coding:UTF-8 -* et c'est bon.

    Utiliser le le shebang ou .encode() ?

  14. #14
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 915
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 915
    Points : 7 303
    Points
    7 303
    Par défaut
    unicodedata avec sa fonction normalize doit faire ça correctement je pense.

    L'option NFKD doit être la bonne...

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 93
    Points : 49
    Points
    49
    Par défaut
    J'ai essayé ça

    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
     
    import tkinter
    import os
    import unicodedata
     
     
    def choixrep():
        global rep
        the_path = unicodedata.normalize('NFKD',"D:\Mes documents\Maths\DEA\Mémoire")
        if os.path.isdir(the_path):
            rep = tkinter.filedialog.askdirectory(initialdir=the_path,
                                                  title='Choisissez un répertoire')
            if len(rep) > 0:
                print("vous avez choisi le répertoire ",rep)
     
    fen1 = tkinter.Tk()
    tkinter.Label(fen1, text='Répertoire des sources').pack()
    tkinter.Button(fen1, text='Votre choix', command=choixrep).pack()
    tkinter.Button(fen1, text='Quitter', command=fen1.destroy).pack()
    fen1.mainloop()
    mais ça ne fonctionne pas non plus. Seule la méthode de Mont29 a fonctionné.

    Savez-vous comment placer le focus sur ce répertoire par défaut lors de l'ouverture de l'explorateur ? Il me faut déplacer l'ascenseur pour l'atteindre, du coup, l'opération est un peu moins intéressante.

  16. #16
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 915
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 915
    Points : 7 303
    Points
    7 303
    Par défaut
    Tu as essayé avec d'autres modes, le 'NFC' au lieu de 'NFKD' par exemple?

    Edit : Chez moi avec le mode 'NFC' c'est fonctionnel !

  17. #17
    Membre éprouvé

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Points : 1 273
    Points
    1 273
    Par défaut
    @ PauseKawa: Il faut distinguer l’encodage du code lui-même, de celui des chaînes.

    En py3, les chaînes sont toujours en unicode. Mais dans le cas d’un literal, au moment de la lecture du code, python se charge de la conversion depuis l’encodage du fichier .py. Donc, si on précise avec le # -*-coding:Latin-1 -* l’encodage du .py, il faut que ce fichier (qui n’est rien d’autre que du texte) soit effectivement encodé en latin-1 par l’éditeur de texte (et pas, par exemple, en utf-8)…

    Normalement, l’encodage de la console n’intervient qu’en absence de ce pseudo-commentaire…

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 93
    Points : 49
    Points
    49
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Tu as essayé avec d'autres modes, le 'NFC' au lieu de 'NFKD' par exemple?

    Edit : Chez moi avec le mode 'NFC' c'est fonctionnel !
    Avec le code de mon précédent post, aucun mode ne fonctionne.

    Avez-vous le même résultat au niveau du focus (il faut scroller pour voir le répertoire) ?

  19. #19
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 915
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 915
    Points : 7 303
    Points
    7 303
    Par défaut
    Je suis sous Unix, donc le path n'est pas de la même forme.

    Difficile de tester votre code, cette ligne est incorrecte

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    rep = tkinter.filedialog.askdirectory(initialdir=the_path,
                                                  title='Choisissez un répertoire')
    Voilà la preuve que c'est fonctionnel

    Nom : Screenshot from 2012-05-12 15:46:40.png
Affichages : 3116
Taille : 14,8 Ko

  20. #20
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 93
    Points : 49
    Points
    49
    Par défaut
    Je vous crois sans problème .

    Je ne comprends pas, il y a un erreur dans la ligne que vous citez ? Pour tant ce code fonctionne

    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
     
    import tkinter
    import os
     
    def choixrep():
        global rep
        the_path = "D:/Mes documents/Maths/DEA/Mémoire".encode("cp1252")
        if os.path.isdir(the_path):
            rep = tkinter.filedialog.askdirectory(initialdir=the_path,title='Choisissez un répertoire')
            if len(rep) > 0:
                print("vous avez choisi le répertoire ",rep)
     
    fen1 = tkinter.Tk()
    tkinter.Label(fen1, text='Répertoire des sources').pack()
    tkinter.Button(fen1, text='Votre choix', command=choixrep).pack()
    tkinter.Button(fen1, text='Quitter', command=fen1.destroy).pack()
    fen1.mainloop()
    J'obtiens

    http://www.casimages.com/img.php?i=1...2234474485.jpg

    et j'aimerais plutôt

    http://www.casimages.com/img.php?i=1...1857290594.jpg

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Problème avec accent dans fichier
    Par shaun_the_sheep dans le forum Administration système
    Réponses: 3
    Dernier message: 19/11/2006, 20h46
  2. Réponses: 8
    Dernier message: 16/11/2006, 10h15
  3. Requête avec accent dans navicat
    Par Marconico dans le forum Requêtes
    Réponses: 2
    Dernier message: 06/11/2006, 12h31
  4. Batch et répertoire avec accent
    Par krfa1 dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 28/10/2005, 10h31
  5. [JavaMail] Pb avec accent dans sujet et corps de l'email
    Par shaun_the_sheep dans le forum API standards et tierces
    Réponses: 7
    Dernier message: 29/10/2004, 12h42

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