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 :

[2.5]Pb avec un raw_input et caractères spéciaux (slash,antislash,= importants)


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 52
    Par défaut [2.5]Pb avec un raw_input et caractères spéciaux (slash,antislash,= importants)
    Bonjour tout le monde...

    J'ai un petit problème tout bête, je suis sûre, mais je n'arrive pas à m'en sortir...
    Dans un de mes programme python, je demande à l'utilisateur de rentrer une chaîne de caractères tel que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    chaine = str(raw_input("entre la chaine : ")))
    Mon problème est que cette chaine me sert pour une interrogation de base de données et qu'elle contient des caractères spéciaux tels que '\' et '=' très important (avec signification impossible à supprimer)...

    exemple : (pour info, c'est de la chimie...)

    sauf que si j'utilise ma chaîne telle qu'elle, vu que c'est un raw-string, ça merdouille pour le '\' et je n'obtiens pas de réponse après interrogation de la base... (si j'interroge avec "C/C=C\\CCC", ça marche, mais je ne peux pas demander à l'utilisateur de doubler ses antislash...)

    J'ai tenté dans ma chaîne de faire de replace ('\\', '\\\\'), ça ne marche pas.
    J'ai tenté de ne pas faire de raw_input, mais des input... mais là ça plante sur le '=' (logique...)...


    J'ai regardé mon ami google, qui ne m'a rien appris de spécial ni même le forum... Juste ça, qui ne m'aide pas http://www.developpez.net/forums/sho...t=python+input
    Bref, je n'ai plus d'idée...
    Y a-t-il une autre méthode qui me serait inconnue ?

  2. #2
    Membre Expert Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Par défaut
    Peut-être dans le module re:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    import re
    chaine = re.escape(chaine)

  3. #3
    Membre émérite
    Avatar de GnuVince
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2004
    Messages
    679
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2004
    Messages : 679
    Par défaut
    Je comprends pas ta question. Ça fonctionne comme il faut.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    >>> s = raw_input()
    C/C=C\CCC
     
    >>> s
    'C/C=C\\CCC'
     
    >>> print s
    C/C=C\CCC
     
    >>> len(s)
    9

  4. #4
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 52
    Par défaut

    Je vais tenter d'être plus claire...

    Mon prog se comporte de la manière suivante :
    1. je demande à l'utilisateur d'entrer une chaine
    2. je me sers de la chaine dans le WHERE de ma requête sql
    3. je sors de ma base le résultat

    Cela donne quelque chose comme cela :
    ETAPE 1 : demande de la chaine
    chaine = str(raw_input("Please enter the query : "))
    ==> C/C=C\C(=O)
    puis traitement
    ETAPE 2 : utilisation de psycopg comme driver postgresql
    query = "select * from maTable Where chaine = \'"+chaine+"\'"
    cursor.execute(query)
    Si ma chaîne est "C/C=C\C(=O)", ma requête ne me renvoie rien...
    Si ma chaîne est "C/C=C\\C(=O)", alors j'ai bien mon résultat...

    (Euh, précisons en passant que ce qui est rentré dans la base est bien C/C=C\C(=O), sans le doublement de l'antislash...

    Ai-je été plus claire ?
    Je vais tenter avec re et je répondrai si ça marche... ou non...

  5. #5
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 52
    Par défaut
    Bon, ben la réponse va être vite arrivée...

    Avec re.escape, ça marche au poil

    Merci beaucoup beaucoup

  6. #6
    Membre émérite
    Avatar de GnuVince
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2004
    Messages
    679
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2004
    Messages : 679
    Par défaut
    Non, non, non! Pas de concaténation pour les requêtes de bases de données; c'est une sources de bugs et de trous de sécurité. Utilise des place holders à la place:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    chaine = raw_input()
    query = "select * from maTable Where chaine = %s"
    cursor.execute(query, chaine)
    http://www.initd.org/tracker/psycopg..._documentation

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 27/11/2009, 16h19
  2. Probléme avec requétes contenant des caractéres spéciaux
    Par dragonfly dans le forum Requêtes
    Réponses: 1
    Dernier message: 08/11/2007, 17h20
  3. problème avec l'affichage des caractères spéciaux
    Par michelkey dans le forum Général Python
    Réponses: 4
    Dernier message: 19/08/2005, 08h09
  4. Soucis avec le remplacement de caractères spéciaux
    Par Oluha dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 04/07/2005, 11h42

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