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 :

Extraction de données


Sujet :

Python

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 77
    Par défaut Extraction de données
    Bonjour à Tous !
    Donc voila je suis débutant sur Python, et j'aimerais avoir quelques indications sur la réalisation d'un petit script pour pouvoir extraire des données d'un fichier log, en l'occurance mettre dans une liste les différentes adresses MAC ... et de meme dans une autre liste les adresses IP

    le fichier log serait de ce style la :

    Oct 1 10:10:44 jackalope syslogd 1.5.0#1ubuntu1: restart.
    Oct 1 10:22:26 jackalope -- MARK --
    Oct 1 10:42:26 jackalope -- MARK --
    Oct 1 10:51:12 jackalope kernel: [ 2970.208144] IN=lo OUT= MAC=00:00:00:00:00:00:00:00:00:00:00:00:08:00 SRC=127.0.0.1 DST=127.0.0.1 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=ICMP TYPE=8 CODE=0 ID=29720 SEQ=1
    Oct 1 10:51:12 jackalope kernel: [ 2970.209061] IN=lo OUT= MAC=00:00:00:00:00:00:00:00:00:00:00:00:08:00 SRC=127.0.0.1 DST=127.0.0.1 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=50406 PROTO=ICMP TYPE=0 CODE=0 ID=29720 SEQ=1
    Oct 1 10:51:13 jackalope kernel: [ 2971.207246] IN=lo OUT= MAC=00:00:00:00:00:00:00:00:00:00:00:00:08:00 SRC=127.0.0.1 DST=127.0.0.1 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=ICMP TYPE=8 CODE=0 ID=29720 SEQ=2
    Somebody To Help me

  2. #2
    Membre émérite
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    491
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 491
    Par défaut
    bonsoir tu peux utiliser les expressions regulieres

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    import re
    r_mac=re.compile(r'MAC=((?:\d\d:){13}\d\d)')
    r_ip=re.compile(r'SRC=((?:\d{1,3}.){3}\d{1,3})')
    liste_mac=[mac for mac in r_mac.findall(open('log.txt').read())]
    liste_ip=[ip for ip in r_ip.findall(open('log.txt').read())]
    print liste_mac
    print liste_ip

  3. #3
    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 Rapide survol
    C'est une question basique qui est souvent posée à laquelle il finit par être d'autant plus fastidieux de répondre que celui qui la pose donne l'impression d'attendre quelque chose de plus ou moins tout cuit.
    C'est pour cela que je pense que ce genre de questions reçoit en général peu de réponses. Pourtant la question est justifiée.
    Tu ne semble pas être demandeur d'un plat tout cuit cas puisque tu demandes «quelques indications». Alors bienvenue sur le forum et voici les conseils rapides que je peux te donner pour ne pas t'éviter le fructueux travail de recherche par soi-même.


    - Tu n'échapperas pas à la lecture nécessaire de la documentation des fonctions et méthodes

    * de fichier
    http://www.python.org/doc/2.5.2/lib/...e-objects.html

    Regarder spécialement:
    close(), read(), readline(). readlines(), seek(), tell(), write()


    * de chaines de caractères:
    http://www.python.org/doc/2.5.2/lib/...s.html#l2h-233

    Parmi elles, regarder plus particulièrement
    count(), endswith(), find() et index(), join(), lstrip() et rstrip(), replace(), rfind(), split() et rsplit(), splitlines()
    partition() et rpartition() très utiles


    - Cherche les dicussions du forum qui ont tourné sur le même sujet que toi. Il y en a des quantités et la lecture des cas précis est instructive.


    - Pour lire un fichier jusqu'à la fin:

    * d'un coup:

    * sequentiellement:

    - on peut d'abord compter le nombre de lignes puis faire une itération en fonction du nombre trouvé

    - on peut faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    rd = 'go'
    while rd!='':
        rd = f.readline()
        ....instructions....
    - ou encore
    «Files support the iterator protocol. Each iteration returns the same result as file.readline(), and iteration ends when the readline() method returns an empty string.»
    dans un lien ci-dessus, ce qui signifie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for ligne in f:
        instructions


    - Pour des recherches de portions de chaine de caractères précisément définies, utilise les méthodes de chaines.

    Tuyaux:

    si y = 'Le Chateau des Carpathes, de Jules Vernes'

    y[0] est le premier caractère 'L'
    y[8] est 'a'
    y[3:7] vaut 'Chat'
    y[3:10:2] est 'Caeu'
    y[3:10:3] est 'Ctu'
    y[-1] est le dernier caractère 's'
    y[-2] est le pénultiéme caractère 'e'
    y[-3] est l'ante-pénultième caractère 'n'
    y[-12:-7] est 'Jules'
    y[13:8:-1] est 'sed u'
    y[3:] est 'Chateau des Carpathes, de Jules Vernes''
    y[24:-30:2] est ',etpa e'
    y[:5] est 'Le Ch'

    utilisation de 'in':
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    'bleu' in "La mer était d'un bleu sombre inquiétant"
    'vert' in "La mer était d'un bleu sombre inquiétant"
    'saucisson' not in  "La mer était d'un bleu sombre inquiétant"
    y[:10]=="Le Chateau"
    renvoie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    True
    False
    True
    True

    - Pour des recherches de portions de chaine de caractères avec une certaine variabilité des caractère, il faut plonger dans le module re.
    Mais il faut réserver l'utilisation de ses possibilités à des cas qui seraient trop ardus à traiter avec les seules méthodes de chaines, car pour des cas simples on peut rapidement se retrouver à vouloir traverser une rue avec un vaisseau spatial.



    - Si tu veux mettre les lignes de ton fichier dans des listes, tu as intérêt à apprendre rapidement l'utilisation des "list comprehension" pour traiter à la vitesse de l'éclair les listes
    http://diveintopython.adrahon.org/na...ing_lists.html

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

    En admettant que tu ais pu lire le fichier log et transformé en liste de lignes (voir message précédent), ton pb peut simplement utiliser la méthode find().

    Soit la ligne: x = "Oct 1 10:51:12 jackalope kernel: [ 2970.208144] IN=lo OUT= MAC=00:00:00:00:00:00:00:00:00:00:00:00:08:00 SRC=127.0.0.1 DST=127.0.0.1 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=ICMP TYPE=8 CODE=0 ID=29720 SEQ=1"

    Alors, i1 = x.find("MAC=") pointe sur le "M" de "MAC=", ou renvoie -1 si "MAC=" ne s'y trouve pas. Donc, le 1er caractère du mac (ici 0) est à i1+4. Il ne reste plus qu'à utiliser l'extraction du code mac: x[i1+4: i1+4+41].

    On peut faire la même chose avec l'adresse IP en cherchant "SRC=". Par contre, l'adresse IP n'ayant pas une longueur fixe, il faut chercher le 1er espace qui suit cette adresse IP: i2 = x.find(" ",i1+4). Il ne reste plus qu'à faire l'extraction: x[i1+4:i2].

    Tyrtamos

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 77
    Par défaut
    Merci pour votre aide précieuse !
    En effet avec la méthode de xavier-Pierre en utilisant les expressions régulières comme tu dis eyquem, c'est vouloir traverser la rue avec un vaisseau spatial ! en tout cas toutes vos réponses me sont précieuses j'en vous en remercie !! Je vais travailler tout ca !

  6. #6
    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 à savoir
    readlines() conserve les retours à la ligne
    splitlines() enlève les retours à la ligne

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

Discussions similaires

  1. [VBA Excel] Extraction de données
    Par tpv72 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 20/09/2005, 21h49
  2. Extraction de données depuis fichier .NDX ...
    Par Olif_C dans le forum WinDev
    Réponses: 4
    Dernier message: 30/08/2005, 11h57
  3. [debutant] extraction de données
    Par tibpower dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 02/08/2004, 14h33
  4. Extraction de données sur des fichiers excel
    Par iupgeii dans le forum MFC
    Réponses: 3
    Dernier message: 23/01/2004, 13h53

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