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 :

Problème de backslash


Sujet :

Python

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 7
    Par défaut Problème de backslash
    Bonjour,

    Malgré mes recherches sur le sujet je ne parviens pas à trouver de solution à mon problème. Pour info, j'utilise python 2.4 sous Windows XP 2002 SP2.

    Je crée un script en python qui récupère des variables d'un autre programme, notamment un chemin d'accès, sous la forme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chemin = 'D:\Travail\test'
    Ce chemin est choisi par l'utilisateur du script et change donc à chaque utilisation. Mon problème est que dans ce cas, le '\t' est interprété par Python comme une tabulation, ce qui pose problème pour la suite des opérations.

    J'ai essayé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chemin.replace('\\','/')
    sans succès, puisque seulement le 1er backslash est remplacé. Je ne sais pas comment utiliser les rawstring dans ce cas, puisque mon chemin est déjà dans une variable, que je ne peux pas modifier en amont. J'espère que ces explications sont claires?

    Quelqu'un aurait-il une solution qui me permettrait d'éliminer ou doubler tous les backslash de ma variable?

    Merci,

    Julie.

  2. #2
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Mai 2002
    Messages : 309
    Par défaut
    Pour ajouter des ' \ ' à ta chaine une simple boucle ' for ' peut faire l'affaire, si tu prends comme indice ' range' le nombre de caractères de cette chaine.
    Il est facile ensuite de tester chaque caractère et d'ajouter un ' \ ' .

    Pour les suprimer, il y a la fonction ' .split(separateur) ' qui te donne une liste.
    C'est aussi simple de reconstituer une chaine à partir de cette liste.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 7
    Par défaut
    Merci pour ta réponse Gamal.

    Cependant, Python considère le '\t' de chemin comme un seul caractère (la longueur de ma chaîne est de 14 et non 15).

    Donc avec la fonction split, je n'obtiens que 2 éléments :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    chemin = 'D:\Travail\test'
    hop = chemin.split('\\')
    >>> print hop
    ['D:', 'Travail\test']
    De même, si j'utilise une boucle for, je ne trouve qu'un seul backslash, le 2ème n'étant pas reconnu comme tel.

    D'autres idées?

  4. #4
    Expert confirmé
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Par défaut
    Ton programme récupère comment la variable de l'autre programme (qui est un programme python ?) ?

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 7
    Par défaut
    Je vais essayer d'expliquer ça du mieux que le peux, mais je ne suis pas sûr de comprendre moi-même tout le processus...

    J'utilise en fait un logiciel de SIG (ArcGIS), qui offre la possibilité de créer des scripts en Python (Python est fourni avec ce logiciel). Je spécifie donc à ArcGIS pour chaque script les paramètres à demander à l'utilisateur, et ArcGIS crée directement une petite interface graphique où l'utilisateur peut remplir ces paramètres. Pratique! Je les récupère ensuite dans mon script, en utilisant 'chemin = sys.argv[1]' par exemple, si mon chemin est le 1er paramètre de mon script.

    Voilà, j'espère que c'est clair?

  6. #6
    Expert confirmé
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Par défaut
    je dirai que le problème vient de l'autre programme qui doit interpréter la chaîne de caractères qu'il récupère (au lieu de la considérer comme une chaîne brute). Tu n'as aucune maîtrise sur ce programme ou cette interface graphique ?

    tu pourrais toujours tenter de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chemin.replace('\t','\\')
    mais il faut faudrait aussi revoir tous les autres cas ('\n', ...)

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 7
    Par défaut
    Hélas non, je n'ai pas à ma connaissance de maîtrise sur l'autre programme. Une solution serait de créer ma propre interface graphique, mais j'aurai préférer éviter, d'une part parce-que ça fait du boulot en plus , et d'autre part parce-que je n'aurai plus le bénéfice des vérifications automatiques de validité des paramètres qu'effectue ArcGIS si j'utilise son interface.

    J'ai bien pensé à la solution de remplacer tous les '\t', '\n', etc., mais comme tu le dis il faut prévoir tous les cas...

    Aucune de ces 2 solutions n'est entièrement satisfaisante, mais ça va me permettre de continuer en attendant de trouver mieux!! Sur tes conseils je vais essayer de voir tout de même s'il n'y aurait vraiment pas moyen de modifier la manière dont mon logiciel interprète la chaîne.

    Merci!

  8. #8
    Membre éprouvé
    Inscrit en
    Mars 2003
    Messages
    127
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2003
    Messages : 127
    Par défaut
    J'ai trouvé ça
    http://code.activestate.com/recipes/65211/
    je ne sais pas si ça peut te convenir

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 7
    Par défaut
    Merci Tyrus!

    Ca correspond effectivement bien à ce que je veux faire. Il est précisé que ça ne marche pas pour tous les cas (dans le cas d'un backslash suivi de certains chiffres d'après ce que j'ai compris), je vais donc prévoir le message d'erreur correspondant pour demander aux utilisateurs de ne pas utiliser de répertoires dont le nom commence par un chiffre.

    Ca devrait faire l'affaire!

  10. #10
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Si je comprends bien,
    il s'agit de transformer une valeur A\tX lue comme 'A' - tabulation - 'X'
    en une valeur lue comme 'A' - '\' - 't' - 'X' c'est à dire la valeur A\\tX?
    C'est bien ça ?

    Je redéfinis ainsi le problème pour éliminer les histoires de :\ dans les chemins auxquelles je ne comprends rien.

    À la place de lire un chemin,
    j'utilise simplement print pour visualiser les effets d'une transformation avec replace(),
    car qui dit 'affichage' dit 'lecture' préalable de la valeur à afficher, non ?


    Pour visualiser la valeur d'une variable chaine,
    une fonction d'une utilité fondamentale: repr()
    Merci à Antoine 935 de l'avoir citée:
    http://www.developpez.net/forums/d73...e/#post4264715

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    print repr('A\tX'),"        representation de la valeur"
    print 'A\tX',"              valeur lue"
    print
    print repr('A\\tX'),"       representation de la valeur"
    print 'A\\tX',"             valeur lue"
     
     
    'A\tX'         representation de la valeur
    A	X      valeur lue
     
    'A\\tX'        representation de la valeur
    A\tX           valeur lue



    Pour changer 'A\tX' en 'A\\tX' : replace('\t','\\t')
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    v = 'A\tX'
    print repr(v)
    print v
    print
    vr = v.replace('\t','\\t')
    print repr(vr)
    print vr
     
    'A\tX'
    A	X
     
    'A\\tX'
    A\tX
    Je ne sais pas si j'ai bien compris le problème et si ceci te sera utile.

    En réalité, il faudrait que tu vérifies quelle est précisément la valeur qu'a ta variable chemin après récupération. Est-ce bien 'D:\Travail\test' ?
    Pour cela il te suffit de faire afficher repr(chemin).
    Donne nous le résultat stp.

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 7
    Par défaut
    Oups...

    Je viens de tester repr(chemin) et voici ce que j'obtiens :
    'D:\\Travail\\test'

    Donc il semblerait que mon problème ne soit pas du tout lié à ça!
    Et que mon logiciel soit plus intelligent que ce que je croyais...

    Désolée de vous avoir embêté avec ça donc... Mais pour vous consoler ce n'était pas inutile puisque j'ai appris plein de choses avec toutes ces recherches, notamment l'utilité de cette fonction repr... Merci eyquem!

    A ma décharge le script fonctionnait parfaitement jusqu'à ce que je change de répertoire de sortie pour utiliser ce fameux 'test'... Je pensais donc que le pb était lié au '\t'. Va falloir trouver d'où ça vient maintenant, mais il s'agit probablement d'une toute autre histoire....

    Merci à tous en tout cas!!

  12. #12
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Je ne comprends plus rien. En relisant les premiers messagesaprés mon message, je m'étais persuadé que la valeur réelle de ta variable chemin comportait ...Travail\test avec un seul caractere \t
    Et puis non....

    Finalement, quel est le problème auquel tu es confronté ?
    Donne le message d'erreur qui s'affiche STP, ce sera une meilleure base pour tout le monde.

  13. #13
    Expert confirmé
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Par défaut
    en fait la fonction repr est la fonction qui transforme les caractères spéciaux en caractères normal donc fait la même chose que le lien présenté plus haut (donc il devrait y avoir les même soucis avec les répertoires commençant par un chiffres).
    Donc tu avais tout à fait raison de proposer repr

    C'est pour cela, qu'en faisant print repr('\t'), on retrouve bien '\t'
    par contre, comme cela rajoute des cotes en début et fin de chaînes,
    il faudra faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chemin = repr(chemin)[1:-1]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    >>> a = '\t'
    >>> a
    '\t'
    >>> print a
     
    >>> b = repr(a)
    >>> b
    "'\\t'"
    >>> print b
    '\t'

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 7
    Par défaut Message d'erreur
    Eyquem, le problème est que je n'obtiens qu'un message d'erreur générique de la part d'ArcGIS lorsque j'exécute mon script (à moins d'avoir spécifiquement prévu l'erreur dans Python). Par contre, lorsque je lance mon script ligne par ligne à partir de Python Shell, en rentrant mon chemin à la main, c'est la partie avec mon chemin et ce fameux '/t' qui posait problème... mais en passant par ArcGIS, et donc en rentrant mon chemin dans l'interface graphique de ce logiciel, il s'est avéré grâce à la fonction repr que ce chemin est bien pris en compte. Contrairement à ce que je pensais le problème ne vient donc pas de là...

    Après recherches, j'avais en fait changé un paramètre de mon logiciel, qui ne trouvait plus certains de ses outils, d'où plantage... sans message d'erreur explicite, j'ai mal interprété la cause du plantage.

    Désolée donc de vous avoir posé des questions sur un faux problème... et merci de m'avoir permis de comprendre que ça ne venait pas de là!

Discussions similaires

  1. Problème avec les double backslash
    Par vinystic dans le forum Paradox
    Réponses: 2
    Dernier message: 08/10/2012, 15h30
  2. JSON from PHP to Silverlight problème avec les BackSlash's
    Par s.toubal dans le forum Silverlight
    Réponses: 4
    Dernier message: 16/02/2012, 14h43
  3. Réponses: 3
    Dernier message: 09/01/2011, 09h30
  4. Problème double backslash
    Par 0x0000091 dans le forum C++
    Réponses: 13
    Dernier message: 13/08/2009, 12h03
  5. [RegEx] Problème avec les backslashes
    Par Shuny dans le forum Langage
    Réponses: 4
    Dernier message: 25/05/2007, 23h01

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