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 :

Caractères spéciaux dans une adresse de répertoire


Sujet :

Python

  1. #1
    Invité
    Invité(e)
    Par défaut Caractères spéciaux dans une adresse de répertoire
    Bonjour à tous,

    Tout d'abord je tiens à préciser que je ne suis malheureusement pas un crack en programmation. Il va peut-être faloir être patient

    J'ai un petit soucis avec les caractères spéciaux. J'ai bien compris qu'il s'agit d'une différence d'encodage mais je n'arrive pas à m'en sortir. Voici le scénario:

    J'ai écrit un petit script dans lequel je définis en premier un répertoire soucre et un répertoire destination:

    SOURCE = "O:\\Rep1\\Sous-Rep1\\probläm\\"
    ARCHIVE = "O:\\Rep2\\Sous-Rep2\\probläm\\"

    L'ideé est d'aller chercher un fichier dans le répertoire source, de faire quelques opérations basiques dessus et de le sauvegarder dans le répertoire destination. Tout marche parfaitement à un détail près : les noms de ces répertoires contiennent des caractères spéciaux et je n'ai pas le droit de les changer (c'est sur un disque réseau dans mon entreprise et plusieurs personnes utilisent ces répertoires).

    Du coup à l'exécution j'ai ça:

    WindowsError: [Error 3] Le chemin d'accès spécifié est introuvable: 'O:\\Rep1\\Sous-Rep1\\probl\xe4m\\'

    Merci de votre aide!

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 298
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 298
    Points : 6 778
    Points
    6 778
    Par défaut
    Salut,

    Essayes avec ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    src = "O:\\Rep1\\Sous-Rep1\\probläm\\"
    SOURCE = src.encode(sys.getfilesystemencoding(), 'replace')
    Pas de Windows pour vérifier, mais c'est ce que j'utilise sous Linux.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Salut,

    Merci pour ta réponse! J'ai essayé mais j'ai eu le doit à ceci :

    SOURCE = src.encode(sys.getfilesystemencoding(), 'replace') NameError: name 'src' is not defined

    Y'a-t'il une librairie spéciale à charger?

    Pour le moment dans mes "import" j'ai:

    import os
    import shutil
    import re
    import sys

    Merci!

  4. #4
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 298
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 298
    Points : 6 778
    Points
    6 778
    Par défaut
    Relis mon exemple, j'ai divisé ta ligne SOURCE = ... en deux lignes.

  5. #5
    Invité
    Invité(e)
    Par défaut
    ah désolé!

    Du coup j'ai corrigé ça et j'ai un autre type d'erreur

    UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 17: ordinal not in range(128)

    Une idée?

    Merci de ton aide!

    (pour information, les vrais noms de répertoires que j'utilise ne sont pas ceux-indiqués dans ce post pour des raisons de confidentialité en accord avec la politique de mon entreprise. Mais le caractère spécial qui pose problème est bien un ä)

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Je relance ma question... Ets-ce que quelqu'un a une idée pour contourner ce problème?

    Merci!

    Citation Envoyé par piloubu Voir le message

    UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 17: ordinal not in range(128)

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 241
    Points : 36 698
    Points
    36 698
    Par défaut
    Salut,

    La plupart des erreurs que vous avez sont dues à la version de Python que vous utilisez (version 2.x).
    Si vous n'avez pas de bonnes raisons pour rester sous cette version, utilisez/apprenez avec une 3.2 ou mieux une 3.3.

    Si vous devez restez en 2.7...
    open accepte les noms de fichiers Unicode.
    Dans le cas de litéraux, il faut les préfixer par un "u":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> z = open(u'élément.txt', 'r')
    >>> z.name
    u'\xe9l\xe9ment.txt'
    et inclure dans le code source l'encoding utilisé pour coder la chaîne de caractères (le défaut pour Python3 est utf-8, pour Python2 c'est ASCII)
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Invité
    Invité(e)
    Par défaut
    Bonjour

    Citation Envoyé par wiztricks Voir le message

    utilisez/apprenez avec une 3.2 ou mieux une 3.3.
    J'ai téléchargé python 3.3 pour windows. Il semble effectivement que cette modification ait fait avancer un peu la chose car le caractère spécial ne semble plus poser de problème.

    MAIS

    J'ai maintenant un autre soucis llié à cette modification. Mon programme est censé regarder tous les fichiers qui sont dans le répertoire source, et pour ceux dont le nom a une certaine forme, les déplacer dans un répertoire de destination qui est de la forme source+nom de fichier.

    grosso modo le code est le suivant:

    SOURCE = "O:\\Rep1\\Sous-Rep1\\probläm\\"

    for file_name in os.listdir(SOURCE):
    if re.match(r'^(AB_01).*\.txt$',file_name):
    FINAL_DEST = SOURCE+file_name[6:8]+"\\"
    shutil.move(SOURCE+file_name,FINAL_DEST)
    Je ne sais pas si c'est très clair

    Toujours est-il qu'avec cette nouvelle version de python j'ai maintenant:

    if re.match(r'^(VD_61).*\.txt$',file_name):
    File "C:\Python33\lib\re.py", line 156, in match
    return _compile(pattern, flags).match(string)
    TypeError: can't use a string pattern on a bytes-like object


    Et là j'ai un peu de mal à voit comment faire: si je convertis mon nom de fichier en bytes-like object, comment faire pour la concaténation de chaine qui définit le répertoire FINAL_DEST?

    Merci de votre aide!

  9. #9
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2011
    Messages : 180
    Points : 321
    Points
    321
    Par défaut
    Bonjour,

    C'est bizarre mais, chez moi, quand j'essaie de reproduire ton problème
    avec python 3.3, le code fonctionne.

    Pour bien faire, il faudrait un exemple minimal un peu plus complet. Par exemple, quel est l'encoding du fichier source (celui qui contient le programme) ?

    Au passage, il est plus simple avec python de taper les path à la UNIX (c:/doc/fichier.txt plutôt que c:\\doc\\fichier.txt

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 241
    Points : 36 698
    Points
    36 698
    Par défaut
    Si vous êtes en 3+, r'^(AB_01).*\.txt$' est unicode.
    Par contre os.listdir retourne des bytes que lorsque son argument est bytes.
    Et telle que construite, SOURCE devrait être un str unicode.

    Impossible de comprendre cette erreur avec les informations que vous donnez!
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  11. #11
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Si vous êtes en 3+, r'^(AB_01).*\.txt$' est unicode.
    Par contre os.listdir retourne des bytes que lorsque son argument est bytes.
    Et telle que construite, SOURCE devrait être un str unicode.

    Impossible de comprendre cette erreur avec les informations que vous donnez!
    - W
    Je vais essayer d'être plus clair mais ce n'est pas simple car il y a pas mal de choses confidentielles. Voici la structure quasi entière du code. Mais ce ne doit pas être très rigoureux... Pardonnez par avance la facon dont tout celà est écrit (et vous comprendrez mon faible niveau en programmation).


    import os
    import shutil
    import re
    import sys

    SOURCE = "O:\\Rep1\\Sous-Rep1\\probläm\\"
    ARCHIVE = "O:\\Rep2\\Sous-Rep2\\probläm\\"

    def main():

    #Task 1 : Remove useless files, and keep AB files

    for file_name in os.listdir(SOURCE):
    if re.match(r'^(AB_01).*\.txt$',file_name):

    length=len(file_name)
    print(file_name)
    for j in range (length-3):
    if (file_name[5]=='0'):
    FINAL_DEST = ARCHIVE+"AB_01"+file_name[6:8]+"\\"
    else:
    FINAL_DEST = ARCHIVE+"AB_01 "+file_name[5:8]+"\\"
    if not os.path.exists(FINAL_DEST):
    os.mkdir(FINAL_DEST)
    print('Creating '+FINAL_DEST+'\n')
    if not os.path.exists(FINAL_DEST+file_name):
    shutil.move(SOURCE+file_name,FINAL_DEST)
    print('Archiving in '+FINAL_DEST+'\n')
    elif os.path.exists(FINAL_DEST+file_name):
    os.remove(SOURCE+file_name)
    print('File already exists \n'+'Deleting file\n')
    break
    else :
    print('File not treated! Please check the name of the file manually'+'\n')
    elif
    os.remove(SOURCE+file_name)
    print(file_name+' is not a AB_01file\n'+'Deleting '+file_name+'\n')
    main()


    Encore merci du coup de main!

  12. #12
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2011
    Messages : 180
    Points : 321
    Points
    321
    Par défaut
    Bonjour

    Tel quel, ton code devrait fonctionner. J'ai l'impression que ton problème vient
    de l'encodage du fichier source.

    Pour en être convaincu, essaie de faire si tu n'a pas str, ce n'est pas bon car, en python 3, tu ne peux mêler allègrement les type str et byte.

    Voici quelquesconseils


    Utilise un édieur qui sauvegarde nativement en utf-8
    Commence tous tes codes par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    Quand tu poste du code, utilise la balise CODE, cela facilite la tâche de ceux
    qui veulent t'aider.
    En espérant t'avoir été utile

  13. #13
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2011
    Messages : 180
    Points : 321
    Points
    321
    Par défaut
    Oups, dans le dernier exemple, j'ai malencontreusement inséré une ligne blanche.
    Bien entendu, pour que cela fonctionne, il ne s la mettre

  14. #14
    Invité
    Invité(e)
    Par défaut
    Tout fonctionne comme je voulais maintenant!!

    Merci de vos nombreux conseils et coups de main et bonne continuation.

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

Discussions similaires

  1. Suppression espace et caractère spéciaux dans une chaine de caractère
    Par arnaud036 dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 12/10/2007, 11h51
  2. [SQL] Problème d'affichage de caractère spéciaux dans une variable chaîne
    Par Kryptonaute dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 18/08/2006, 09h40
  3. Affichage caractéres spéciaux dans une alert.
    Par nebule dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 05/05/2006, 14h51
  4. [RegEx] caractère spéciaux dans une chaine
    Par BigBarbare dans le forum Langage
    Réponses: 3
    Dernier message: 12/04/2006, 12h53
  5. Caractères spéciaux dans une boite de dialogue
    Par Rafiki dans le forum Général JavaScript
    Réponses: 22
    Dernier message: 09/03/2006, 15h05

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