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 :

caractere '\' intempestif [Python 2.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 28
    Par défaut caractere '\' intempestif
    Bonjour,

    J'ai besoin de votre aide pour un problème que je n'arrive pas a régler malgré pléthores de tests.

    J'ai écrit un petit code qui me permet de valoriser une BDD de diverses tables.Pour m'aider dans la saisie des tables j'ai saisi divers tuple qui pourraient s'apparenter à une description du dictionnaire des données, une sorte de squelette de la BDD.J'y ai ajouté un tuple maintenance qui me permet de nombreux tests de validation ou d'enregistrement de données récupérées ci et la pour valider les requêtes dont j ai besoin tout au long du programme. Je vous passe les divers tests d'erreur que j'opère ci et la pendant l'accès a la base.

    Cependant au moment clé de la création de la requête qui va me servir a valoriser ma BDD, j'ai le caractère '\' qui s'insère dans les valeurs que j'appelle petit a petit et qui me permette de construire ma requête. En fait je crée 1 string avec une boucle qui récupère les valeurs utiles, construisant "une phrase" qui est qualibrée pour un INSERT ou UPDATE. Une fois constituée, je l’agrège à une variable requête et j'y rajoute 1 champs condition pour éviter les erreurs.

    C'est A ce moment que j'ai un truc du style phrase='\données1', '\donnée2', '\donnée3'...."

    Après des recherches net j'ai trouvé ça : s.replace("\"","") mais ça ne fonctionne que dans l'interpréteur. De plus ces caractères n'apparaissent que lorsque j'accole a ma requête 1 champ de condition SQL de type "WHERE ....". J'ai testé avec encode ou decode et d'autres tour de magie mais sans succès.En fait impossible de m'en débarrasser.

    Je suis totalement bloqué à cause de cette saloperie de caractère qui s'insère entre les valeurs récupérées et qui me fait penser au code de la touche entrée sur laquelle j'appuie quand je saisie les champs à la base.Etant noob(5 mois d'apprentissage python) je ne sais plus quoi faire.Pour le reste le code est total OK.

    Merci pour votre secours
    Cordialement

  2. #2
    Expert confirmé

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Après des recherches net j'ai trouvé ça : s.replace("\"","") mais ça ne fonctionne que dans l'interpréteur.
    Sans doute que tu l'utilises mal.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    >>> s = "jfhurt"
    >>> s.replace('f', ' ')
    'j hurt'
    >>> s
    'jfhurt'
    >>> s = s.replace('f', ' ')
    >>> s
    'j hurt'
    En fait je crée 1 string avec une boucle qui récupère les valeurs utiles, construisant "une phrase" qui ....
    On peut voir ce code là ? Dans le vide, on ne peut rien dire.

  3. #3
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Citation Envoyé par VinsS Voir le message
    Salut,



    Sans doute que tu l'utilises mal.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    >>> s = "jfhurt"
    >>> s.replace('f', ' ')
    'j hurt'
    >>> s
    'jfhurt'
    >>> s = s.replace('f', ' ')
    >>> s
    'j hurt'
    On peut voir ce code là ? Dans le vide, on ne peut rien dire.
    Oui, mais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> s= "jfhurt"
    >>> s.replace('f','')
    'jhurt'

  4. #4
    Expert confirmé

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Citation Envoyé par marco056 Voir le message
    Oui, mais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> s= "jfhurt"
    >>> s.replace('f','')
    'jhurt'
    Mon propos n'est pas que l'on remplace x par y ou espace or rien mais que la méthode replace() ne transforme pas "sur place" la chaîne de texte mais retourne une autre chaîne transformée.

  5. #5
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Citation Envoyé par VinsS Voir le message
    Mon propos n'est pas que l'on remplace x par y ou espace or rien mais que la méthode replace() ne transforme pas "sur place" la chaîne de texte mais retourne une autre chaîne transformée.

    J'avais mal compris, désolé.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 28
    Par défaut
    Bonjour,

    Comme vous êtes impatient de lire mon code,je vais vous fournir les parties utiles qui posent problème.Pas le tout y'en a pour des kilomètres:

    Déjà 1 exemple de mon dictionnaire des données regroupé sous une liste:
    if typerelation=="1":
    maintenance=[schoixmenu,"etrepresent","1","",choixmenu,"","","True","","individus","structures","nom_individu","nom_structure"]
    cles=('num_individu','num_structure','organigramme','date_entree','date_sortie')
    libelles=('Le nom de la personne','le nom de la structure','Sa place dans l organigramme','date integration','depart')
    Ici vous voyez 1 table relation a enregistrer.Il y a le tuple maintenance pour mes calculs et conservation de résultats a la volée et les 2 autres tuples sont les champs de la table avec les clés.

    Je vous passe les calculs sur la recherche de doublons,de PK etc qui fonctionne très bien sans erreur.J'ai réglé le problème du caractère intempestif pour la requête UPDATE.J'avais oublié des quotes dans l'expression ??.format().Du coup ça fonctionne.

    Le problème est maintenant sur une requête INSERT.Pour expliciter ma démarche,INSERT est utile lors de la saisie de données en direct par l'utilisateur.Les 3 listes sus-citées je les intègre dans une variable lstmenu que j'envoie à chaque fois en paramètre de fonction et qui sera transformé au grès des calculs.La saisie des données je la conserve dans 1 tuple que je mets en fin de position lstmenu.Pour INSERT tout est simple,s'il n'ya pas de doublon,d'erreur particulière ça donne ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1234
     
    reqsaisir="INSERT INTO {} VALUES{}"
     if lstmenu[0][4]=="S":#Mode saisir
                requete=reqsaisir.format(lien,lstmenu[3])#lien est la table à valoriser
    Et la bingo ça me donne un truc du style :
    insert into personne values('\donnee1', '\donnee2', ....)
    Ce caractère '\' s'insère en début de donnée uniquement dans la zone values().Quand je le replace() ça me fait péter 1 quote en fin de ce champ values et donc invalide la syntaxe SQL.

    Voila tout le reste fonctionne.Il me reste cette saleté a valider pour passer à l'étape Tkinter.

    Merci pour votre aide.
    Cordialement

  7. #7
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 742
    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 742
    Par défaut
    Salut,

    Citation Envoyé par estrasse Voir le message
    Cependant au moment clé de la création de la requête qui va me servir a valoriser ma BDD, j'ai le caractère '\' qui s'insère dans les valeurs que j'appelle petit a petit et qui me permette de construire ma requête. En fait je crée 1 string avec une boucle qui récupère les valeurs utiles, construisant "une phrase" qui est qualibrée pour un INSERT ou UPDATE. Une fois constituée, je l’agrège à une variable requête et j'y rajoute 1 champs condition pour éviter les erreurs.
    Plutôt que de "nettoyer" les caractères intempestifs, çà serait "mieux" d'essayer de comprendre pourquoi ils arrivent et de corriger cette génération qui ne devrait pas être si "spontanée". D'autant que si ce caractère là n'a rien à faire ici, le bug qui les produit pourrait en fabriquer d'autres.
    Bien sûr ne pas se poser ce genre de question et "nettoyer" est aussi une solution.

    - W
    PS: et c'est comme çà que nous avons rendu notre planète presque inhabitable.
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 28
    Par défaut
    Déjà merci pour vos réponse rapides.

    Pour expliciter mieux le déroulement:
    D'abord j'envoie 1 requête qui soit récupère les clés primaires (PK) susceptibles d'exister soit 1 retour vide pour 1 ligne inexistante.Ensuite je teste si il y a 1 ou des doublons vu que je ne peux pas baser ma recherche sur des PK uniques.Enfin si il n'y a pas d'erreur manifeste j'envoie pour une requête INSERT/UPDATE avec un tuple maintenance qui conserve les PK, la requête utile,certaines vérif et des tuples qui ont les descriptions des tables a valoriser.

    Pour créer ces requêtes, soit pour INSERT/UPDATE j'utilise le tuple qui a les données saisies ou récupérées par calcul.C'est une boucle qui crée un agrégat entre données/valeurs et qui monte 1 phrase type string.A la fin j'ajoute un string de condition qui doit éviter les doublons d'enregistrement.C'est à ce moment seulement que dans le string qui formate les valeurs à garder, exemple "VALUES (donnée1,donnée2...)", s'insère le caractère "\" devant et à la fin de la valeur conservée du style '\donnée1\'. Dès lors la requête ne fonctionne pas à cause de ces caractères.Cela n'apparaît pas quand je n'ajoute pas un string de condition.J'ai même essayé de créer une phrase unique regroupant tout et ça fait pareil.

    Je dois ajouter que ces données sont issues d'un mode "saisie" ou "modification" qui consiste a saisir les champs par raw_string selon le mode.Donc dès que j'ai validé je tape sur entrée, ce qui me fait penser que ces "\" correspondent au code touche "entrée".Mais je ne sais comment les évacuer de la requête finale.
    Ca n'a pas de sens du fait que c'est un agrégat de string(phrase de base+ condition) et quand je ne mets pas cette condition ça ne fait pas ce rajout.

    Voila je ne vois pas quoi rajouter.

    merci encore

  9. #9
    Expert confirmé

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Citation Envoyé par estrasse Voir le message
    Déjà merci pour vos réponse rapides.

    Pour expliciter mieux le déroulement:
    D'abord j'envoie 1 requête qui soit récupère les clés primaires (PK) susceptibles d'exister soit 1 retour vide pour 1 ligne inexistante.Ensuite je teste si il y a 1 ou des doublons vu que je ne peux pas baser ma recherche sur des PK uniques.Enfin si il n'y a pas d'erreur manifeste j'envoie pour une requête INSERT/UPDATE avec un tuple maintenance qui conserve les PK, la requête utile,certaines vérif et des tuples qui ont les descriptions des tables a valoriser.

    Pour créer ces requêtes, soit pour INSERT/UPDATE j'utilise le tuple qui a les données saisies ou récupérées par calcul.C'est une boucle qui crée un agrégat entre données/valeurs et qui monte 1 phrase type string.A la fin j'ajoute un string de condition qui doit éviter les doublons d'enregistrement.C'est à ce moment seulement que dans le string qui formate les valeurs à garder, exemple "VALUES (donnée1,donnée2...)", s'insère le caractère "\" devant et à la fin de la valeur conservée du style '\donnée1\'. Dès lors la requête ne fonctionne pas à cause de ces caractères.Cela n'apparaît pas quand je n'ajoute pas un string de condition.J'ai même essayé de créer une phrase unique regroupant tout et ça fait pareil.

    Je dois ajouter que ces données sont issues d'un mode "saisie" ou "modification" qui consiste a saisir les champs par raw_string selon le mode.Donc dès que j'ai validé je tape sur entrée, ce qui me fait penser que ces "\" correspondent au code touche "entrée".Mais je ne sais comment les évacuer de la requête finale.
    Ca n'a pas de sens du fait que c'est un agrégat de string(phrase de base+ condition) et quand je ne mets pas cette condition ça ne fait pas ce rajout.
    Désolé, mais ce charabia est inutile

    Voila je ne vois pas quoi rajouter.
    ben, le code par exemple.

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 06/11/2007, 12h36
  2. éliminer un caractere d'un string
    Par no-vice dans le forum Langage
    Réponses: 5
    Dernier message: 09/08/2002, 14h55
  3. Réponses: 3
    Dernier message: 12/06/2002, 21h15
  4. Réponses: 2
    Dernier message: 29/05/2002, 20h43
  5. Probleme sur les chaines de caractere
    Par scorpiwolf dans le forum C
    Réponses: 8
    Dernier message: 06/05/2002, 19h01

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