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 :

chaine de caractere


Sujet :

Python

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2008
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 44
    Points : 16
    Points
    16
    Par défaut chaine de caractere
    salut
    je voudrais savoire comment retourner en python une chaine de caractere dans un texte
    par exemple cette chaine de caractere:

    248.386 228.65 mo
    (123492-1243)
    [7 7 7 7 7 7 4.6619 7 7 7 0 ]xsh
    je veux k il me retourner (123492-1243),sachant que 248.386 228.65 mo et [7 7 7 7 7 7 4.6619 7 7 7 0 ]xsh sont des variables que je connais deja

  2. #2
    Membre extrêmement actif
    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
    Points : 1 658
    Points
    1 658
    Par défaut pas clair
    Ça veut dire quoi "retourner un chaîne de caractères" ?
    Ce ne serait pas plutôt "retrouver une chaîne" , étant donné l'exemple que tu donnes ?

    dans quoi se trouve
    248.386 228.65 mo
    (123492-1243)
    [7 7 7 7 7 7 4.6619 7 7 7 0 ]xsh
    ???
    Ces caractères sont tous dans une variable et il faut distinguer (123492-1243) du reste, sachant que le reste se trouve dans deux autres variables ?

  3. #3
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 893
    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 893
    Points : 7 249
    Points
    7 249
    Par défaut
    Je pense que pour faire un programme ordonné il faut deja bien savoir ce qu'on fait. Dans ce cas on ne comprend ni le but, ni les termes, ni la phrase.

    Le problème n'est pas posé correctement et explicitement

    L'objectif à atteindre n'est pas suffisament compréhensible

    La question que je me pose :

    Comment peux-tu aider?

    Simplement en reprenant ce post depuis le début, avec des belles phrases, prendre le temps de poser le problème avec précisions et surtout se mettre à la place des lecteurs

    Sur ce genre de post, je n'essaie même plus de comprendre

  4. #4
    Membre à l'essai
    Inscrit en
    Mai 2008
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 44
    Points : 16
    Points
    16
    Par défaut string
    desolée si j'explique mal,
    j'ai un fichier texte et je veux extraire un string qui se trouve entre deux autres strings.
    ex:
    string1
    ma chaine que je veux extraire
    string2
    je veux une fonction qui prend comme parametre string1 et string2 et qui me retourne :' ma chaine que je veux extraire'
    j'ai essayé un petit programme qui me donne le resultat que je veux mais il ne traite pas le retour de la ligne et aussi c'est juste pour cet exemple: ma chaine a extraire se trouve entre parentheses, c'est un cas particulier .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    chaine='248.386 228.65 mo(123492-1243)[7 7 7 7 7 7 4.6619 7 7 7 0 ]xsh'
    results= [x[0] for x in [x.split(')') for x in chaine.split('(')[1::]]]
    for i in results:
        print i
    donc ce n'est pas que je veux

  5. #5
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 893
    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 893
    Points : 7 249
    Points
    7 249
    Par défaut
    Pourquoi n'utilises-tu pas le module "re"?

    exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    f=open('fichier.txt', 'r')
    f=f.read()
    nombre=re.findall('[0-9]{6}-[0-9]{4}', f)
     
    print nombre
    Tu demandes à trouver tous les nombres du style xxxxxx-xxxx dans le fichier texte f

    Les expressions régulières sont une des choses incontournables de la programmation.

    Moi même ne le maîtrise pas correctement, c'est un apprentissage qui peut etre plus ou moins long mais utile.


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

    En fonction de ce que j'ai compris:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
     
    def extraitchaine(string1, string2, chaine):
        return chaine[len(string1):len(chaine)-len(string2)]
     
    string1='248.386 228.65 mo'
    string2='[7 7 7 7 7 7 4.6619 7 7 7 0 ]xsh'
    chaine='248.386 228.65 mo(123492-1243)[7 7 7 7 7 7 4.6619 7 7 7 0 ]xsh'
     
    print extraitchaine(string1, string2, chaine)
    Ce qui affiche:

    Tyrtamos

  7. #7
    Membre à l'essai
    Inscrit en
    Mai 2008
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 44
    Points : 16
    Points
    16
    Par défaut
    merci de la reponse
    mais je ne sais pas la longueur de la chaine ,c'est un fichier texte et je dois trouver une chaine entre deux autres chaines que je connais deja
    peut etre la solution c'est utiliser les expressions regulieres mais je ne sais pas comment

  8. #8
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Points : 923
    Points
    923
    Par défaut
    Si jamais tes chaines ne sont pas respectivement au début et à la fin, tu peux faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def extraire(debut, fin, chaine):
        apres = chaine.partition(debut)[2]
        return apres.rpartition(fin)[0]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> debut = '248.386 228.65 mo'
    >>> fin = '[7 7 7 7 7 7 4.6619 7 7 7 0 ]xsh'
    >>> chaine='248.386 228.65 mo(123492-1243)[7 7 7 7 7 7 4.6619 7 7 7 0 ]xsh'
    >>> extraire(debut, fin, chaine)
    '(123492-1243)'

  9. #9
    Membre à l'essai
    Inscrit en
    Mai 2008
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 44
    Points : 16
    Points
    16
    Par défaut
    merci mais je crois avant d 'appeler votre fonction je dois trouver la chaine d'abord

  10. #10
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 893
    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 893
    Points : 7 249
    Points
    7 249
    Par défaut
    merci mais je crois avant d 'appeler votre fonction je dois trouver la chaine d'abord
    Moi je crois que tu n'as pas compris les exemples précédents qui sont tous corrects, sachant que ta chaîne peut-être aussi bien un fichier texte, qui lui même peut-etre appelé facilement.

    A toi de réfléchir un peu et d'utiliser tes tutos!

    Nous ne sommes pas là pour te mâcher le travail.


  11. #11
    Membre à l'essai
    Inscrit en
    Mai 2008
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 44
    Points : 16
    Points
    16
    Par défaut
    desolee fred mais j'ai compris , j'ai des millier de fichiers et je dois trouver la chaine ,car les deux exemples precedants, la chaine est un argument .
    je ne vais pas m'amuser de la trouver pour chaque fichier donc je dois ajouter du code pour trouver la chaine avant de la mettre comme argument non?
    si vous voulez m'aidez ok ,sinon vous n'etes pas obligé de me repondre et me faire la morale

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

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Points : 1 728
    Points
    1 728
    Par défaut
    l'argument chaine ne représente pas la chaine à trouver (sinon quel intérêt?) mais le contenu de ton fichier.

  13. #13
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 893
    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 893
    Points : 7 249
    Points
    7 249
    Par défaut
    j'ai des millier de fichiers et je dois trouver la chaine
    Alors cette donnée était une donnée importante non citée précédemment

    Il faudra deja créé un traitement sur chacun de tes fichiers qui sont par exemple dans un répertoire.

    for fichier in repertoire:
    etc...

    je ne vais pas m'amuser de la trouver pour chaque fichier
    Si tu fais ce que je t'ai dis précédemment tu n'auras pas à le faire

    pour trouver la chaine avant de la mettre comme argument non
    Hein?

    Dans les exemples précédents chaine peut-etre remplacé par un fichier

    si vous voulez m'aidez ok
    On t'as même donné des réponses qui fonctionnent pour ton cas.

    sinon vous n'etes pas obligé de me repondre et me faire la morale
    pas de morale ici, les explications données sont claires, on te donne les réponses correctes et tu nous dis que ce n'est pas cela.

    Alors si c'est pas ça regarde les tutos!!!

    http://python.developpez.com/faq/?page=Fichier
    http://python.developpez.com/faq/?page=Repertoire
    http://python.developpez.com/faq/?pa...#strSousChaine
    http://python.developpez.com/faq/?page=String#strCount

    Bon courage

  14. #14
    Membre à l'essai
    Inscrit en
    Mai 2008
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 44
    Points : 16
    Points
    16
    Par défaut
    pour pacificator:

    tytamos
    def extraitchaine(string1, string2, chaine):
    return chaine[len(string1):len(chaine)-len(string2)]

    oiffrig
    def extraire(debut, fin, chaine):
    apres = chaine.partition(debut)[2]
    return apres.rpartition(fin)[0]

    la chaine dont je parle pacifator c'est cette chaine :'248.386 228.65 mo(123492-1243)[7 7 7 7 7 7 4.6619 7 7 7 0 ]xsh' qui se trouve dans un fichier texte
    la chaine que je veux extraire (123492-1243)



    pour fred :
    moi je parlais de vous et personne d'autre (car vous utilisez le 'on ') ,et j'ai dit merci je dois qu'ajouter un peu de code et je vais l'ajouter seule.
    en tous les cas merci a vous aussi

  15. #15
    Membre extrêmement actif
    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
    Points : 1 658
    Points
    1 658
    Par défaut Bonjour anna
    Les choses sont plus claires. Je peux donc te proposer ce qui suit.


    Première chose.
    Au début de mon utilisation de Python, je lisais les lignes de fichier une à une avec readline() parce que j'avais commencé par traiter des fichiers de taille importante (plusieurs MB) que je ne pouvais pas lire autrement. Mais je me suis aperçu que si un fichier a une taille suffisamment peu importante pour qu'on puisse le lire d'un coup, il est très avantageux de le lire d'un coup pour le mettre dans une liste: chaque ligne du fichier = un élément de la liste. En fait, ce qui compte n'est pas la taille du fichier mais la RAM dont on dispose et qui va permettre de de créer une liste plus ou moins longue. À toi de voir donc quelle taille de fichier tu peux traduire en liste sur ton ordinateur.

    Si c'est bon, mets le fichier dans une liste:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    f=open('nomdefichier.txt', 'r')
    lifi = f.readlines()
    f.close()
    'nomdefichier.txt' est le fichier
    f est l'objet-fichier (ils appellent ça comme ça dans les tutoriels)
    lifi est une liste, readlines() renvoie une liste

    Je trouve préférable de ne pas donner le même nom à l'objet-fichier et à la liste, c'est à dire de ne pas écrire f = f.readlines() , comme l'a écrit fred avec read() . Mais bon si ça marche chacun fait comme il veut....
    C'est mieux aussi de refermer le fichier avec une instruction close()

    Attention, les éléments de la liste lifi sont les lignes du fichier 'nomdefichier.txt' AVEC le caractère de retour à la ligne.
    Pour traiter une ligne dénuée du retour-à-la-ligne, écrire ln[0:-1] ou en abrégé ln[:-1] . Comparer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for ln in lifi:
        print ln
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for ln in lifi:
        print ln[0:-1]
    Je trouve que l'utilisation de readlines() plutôt que read() qui renvoie un string est plus intéressante car
    - la représentation mentale du fichier dans une liste est plus claire que celle d'un fichier dans un string, pour moi,
    - Python traite les listes avec une grande efficacité
    - l'utilisation d'une liste procure des facilités de traitement: par exemple explorer la liste en sautant d'une position à une autre, ou utiliser des "list comprehension" ultra rapides qui simplifient grandement l'écriture des programmes.



    Deuxième chose.
    Concernant les expressions régulières, il faut se méfier.
    Il doit y avoir des cas où l'utilisation d'une expression régulière facilite tellement les choses qu'elle est effectivement incontournable. Mais je pense que les fonctions de base pour traiter des fichiers et des strings sont tellement bien faites et nombreuses qu'on peut se débrouiller très bien avec ces fonctions sans croire qu'il faut directement chercher à recourir à une regex pour tout problème qui n'est qu'en apparence un peu délicat.
    En tous cas, je m'en tiens à ce que j'ai lu ici:
    http://diveintopython.adrahon.org/re...s/summary.html

    « Certaines personnes, face à un problème, se disent "je sais, je vais utiliser une expression régulière." Maintenant elles ont deux problèmes. »
    --Jamie Zawinski, dans comp.emacs.xemacs




    Troisème chose.
    Ton problème est fastoche. Ça tombe bien, je ne sais faire que des trucs fastoches en Python.

    D'après ce que tu expliques le string que tu veux extraire est dans une ligne située entre deux autres lignes connues. Il suffit de trouver la première ligne connue et de vérifier que la seconde ligne connue est deux lignes après, puis d'extraire celle qui se trouve entre les deux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    f=open('nomdefichier.txt', 'r')
    lifi = f.readlines()
    f.close()
     
    lifinet = [ligne[0:-1] for ligne in lifi]
    # il s'agit d'une "list comprehension" qui, à partir de lifi, crée une autre liste dans laquelle les caractères de retour à la ligne ne sont p[lus prsents en bout de ligne
     
    for k in range(0,len(lifinet)):
        if '248.386 228.65 mo' in lifinet[k]:
            if '[7 7 7 7 7 7 4.6619 7 7 7 0 ]xsh' in lifinet[k+2]:
                got = lifinet[k+1]
                if got[0]=='(' and got[-1]==')':
                    trouv = got[1:-1]

    got[0] est le premier caractère du string got, 0 est la position avant le premier caractère
    got[-1] est le dernier caractère du string got, -1 est la position avant le dernier caractère
    got[1:-1] est le string issu de got qui commence à la position 1 (avant le second carcatère) et se termine à la position -1 (avant le dernier caractère)


    Après ce n'est plus qu'une question de tests à mettre en place en fonction de ce que l'on cherche et de ce qui est suscpetible de se présenter dans une ligne.
    Par exemple si le string que tu recherches est noyé au sein d'autre caractères dans sa ligne, tu peux écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    deb = got.find('(')
    fin = got.find(')') + 1  # +1 car find() renvoie la position avant le caractère
    trouv = got[deb:fin]
    Et si les éventualits sont plus diverses, il faut écire des test supplémentaires. Pour le traitement des string, à lire absolument:
    http://docs.python.org/lib/string-methods.html#l2h-233

    Addendum:
    évidemment on peut remplacer les 6 lignes de recherche dans la boucle "for k etc.." par une seule ligne d'une " list comprehension".
    À toi de te renseigner sur les lists comprehension, parce que ça , alors par contre, c'est absolument génial comme possibilité dans Python.

  16. #16
    Membre à l'essai
    Inscrit en
    Mai 2008
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 44
    Points : 16
    Points
    16
    Par défaut
    Merci beaucoup eyquem , parfaite explication

  17. #17
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 893
    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 893
    Points : 7 249
    Points
    7 249
    Par défaut
    Merci beaucoup eyquem , parfaites explications
    Oui mais te concernant il t'a simplement fait le programme de A à Z, pour le reste, sans commentaires.


  18. #18
    Membre extrêmement actif
    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
    Points : 1 658
    Points
    1 658
    Par défaut fred
    Tu as un peu raison, je te comprends pour une part. Je suis moi même assez souvent énervé par des demandes d'aide qui sont rédigées n'importe comment dans lesquelles on ne comprend goutte.
    Mais il ne faut quand même pas s'énerver comme tu le fais, il faut être parfois compréhensif. Anna débute semble-t-il et j'imagine qu'elle a le même problème que moi quand j'ai commencé à m'intéresser à Python: je trouve que tous les tutoriels que j'ai lus sur Python ont un défaut, ils apparaissent comme de gigantesques montagnes qu'on ne sait où commencer à gravir.
    Il n'y a pas UNE seule et unique façon de procéder quand on enseigne quelque chose, il faut s'adapter. Si tu as remarqué , je ne lui ai pas écrit la list comprehension qui condenserait les lignes principales du programme. Il faut lui laisser le temps d'assimiler et de tatonner par elle même. Mais ceci à partir de quelque chose à se mettre sous la dent. C'est frustrant d'avoir l'impression de devoir lire 300 pages avant de comprendre comment commencer à écrire 3 lignes de code. Les choses sont si compliquées de nos jours, ça soulage de trouver parfois des explications rapidement explicantes.

    post scriptum:
    "surtout se mettre à la place des lecteurs"
    tout à fait d'accord avec toi, fred
    c'est ce que j'essaie de faire le plus souvent possible (pas toujours le temps de le faire) quand j'écris et c'est ce que j'ai fait pour anna

  19. #19
    Membre extrêmement actif
    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
    Points : 1 658
    Points
    1 658
    Par défaut oiffrig
    Au lieu de définir spécialement une fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def extraire(debut, fin, chaine):
        apres = chaine.partition(debut)[2]
        return apres.partition(fin)[0]
    pour écrire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    extraire(debut, fin, chaine)
    j'écrirais personnellement directement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print chaine.partition(debut)[2].partition(fin)[0]

  20. #20
    Membre à l'essai
    Inscrit en
    Mai 2008
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 44
    Points : 16
    Points
    16
    Par défaut
    merci

Discussions similaires

  1. Réponses: 9
    Dernier message: 06/11/2007, 12h36
  2. Réponses: 13
    Dernier message: 13/06/2003, 14h13
  3. Pb Update avec chaine de caractere
    Par JuJu° dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 28/05/2003, 15h58
  4. [LG]comparaison de chaines de caracteres
    Par thesam dans le forum Langage
    Réponses: 6
    Dernier message: 20/05/2003, 22h41
  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