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 .txt


Sujet :

Python

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Vente
    Inscrit en
    Février 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Vente
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Février 2016
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Extraction de données .txt
    Bonjour,

    je souhaite extraire certaine données d'un fichier txt. Comme un exemple est souvent plus parlant, voici globalement le format du fichier txt en question : http://www.cjoint.com/c/FBrxgfClBNI.

    L'objectif est de récupérer uniquement certaines informations. Par exemple, je souhaite savoir le système d'exploitation, je récupère la chaine de caractère "Windows 7".

    Je pensais pouvoir m'en sortir en utilisant Excel mais il ne formate pas correctement les données et les rapports générés par AIDA seront différents suivant la machine analysée.

    Par conséquent, je m'oriente sur la réalisation d'un petit outil capable de détecter les lignes qui m'intéresse et identifiées par la partie gauche afin de stocker la chaine de caractère de la partie droite.


    Je n'ai pour l'instant pas de piste concrète mais uniquement des posts qui traitent de l'exploitation des fichiers txt avec python mais sans vraiment correspondre à ce que je cherche. N'hésitez pas à m'indiquer si vous avez des pistes, posts que j'aurais loupé ou simplement m'indiquer si partir sur un petit programme python est pertinent ou non.

    Dans tous les cas, je vous remercie pour vos réponses et conseils.

  2. #2
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    le format du fichier n'est pas idéal, le mieux c'est encore de filtrer avec des expressions régulières à mon avis, d'abord on ne s'occupe que de ce qui est en dessous de la ligne "Résumé" (si j'ai bien compris), ensuite on applique la regex un peu astucieusement et on remplit un dictionnaire pour faciliter l'accès aux données, on prêtera une attention particulière à l'encodage puisque manifestement le fichier contient des caractères accentués
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    >>> import re
    >>> with open('rapport.txt', 'r') as fichier:
    ...   data = re.findall(ur'\[ Résumé \].+', fichier.read().decode('utf-8'), re.DOTALL)[0]
    ...
    >>> toto = [ u'Type de système', u"Système d'exploitation", u'Service Pack du système']
    >>> rgxp = re.compile(ur'(' + ur'|'.join(toto) + ur') +(.+)')
    >>> dico = dict(re.findall(rgxp, data))
    >>> for element in toto:
    ...   print dico[element]
    ...
    ACPI x64-based PC  (Mobile)
    Windows 7
    Service Pack 1

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Vente
    Inscrit en
    Février 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Vente
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Février 2016
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Salut Bufferbob,

    Tout d'abord merci pour ta réponse.

    En essayant d’exécuter ton code j'ai obtenu l'erreur suivante : "UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 25: ordinal not in range(128)"

    Je ne connais pas les expressions régulières donc j'ai du chercher un peu pour comprendre ton code (au passage merci parce que même si mon problème n'est pas encore résolu , c'est très intéressant)

    Si je comprend bien (en vérité pas trop) :

    1/ On ouvre le fichier txt.
    2/ On stocke dans la variable data l'ensemble du texte qui comprend le pattern "[ Résumé ]" (pas sûr d'avoir entièrement compris nottement le flag re.DOTALL)
    3/ On stocke dans la liste "toto" 3 éléments (ceux que l'on souhaitera récupérer par la suite ?)
    4/ On stocke dans rgxp l'objet correspondant au pattern toto (énormément de mal à comprendre ce qu'il se passe mais je comprend que c'est pour l'utiliser dans la commande re.findall juste après)
    5/ On stocke dans "dico" un dictionnaire mais de quoi j'ai du mal à voir.
    6/ On affiche le dictionnaire

    Comme tu peux l'observer, je suis assez peu à l'aise avec ces histoires d'expressions régulières et je m'excuse si ça peut sembler idiot.


    En ce qui concerne le format de fichier assez peu idéal, je suis plutôt d'accord. AIDA permet également d'exporter en html que je te joins juste pour info ( http://www.cjoint.com/c/FBsv5OQKN8I ). J'ai d'ailleurs commencé avec ça en regardant du côté de beautifulsoup pour résoudre mon problème mais j'ai pas réussi à faire quelque chose. Si le problème est plus simple avec ce type de fichier, n'hésite pas à me le faire remarquer

    Pour info, les rapports fournis par AIDA sont fortement tronqués pour simplifier l'exercice (il y a plein de ligne en plus de [ Résumé ] ). Je pars du principe que si j'arrive à faire ce que je cherche sur la partie tronqués j'y arriverai sur l'ensemble mais si c'est une erreur, n'hésite pas à me demander l'ensemble du rapport.

    Je te remercie encore pour ton aide.

  4. #4
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    Citation Envoyé par neliel Voir le message
    En essayant d’exécuter ton code j'ai obtenu l'erreur suivante : "UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 25: ordinal not in range(128)"
    essaye de retaper les accents à la main sans les copier/coller directement, si c'est dans le cadre d'un script directement, n'oublie pas de mettre tout en haut (1ere ou 2eme ligne) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    # -*- coding: utf-8 -*-
    Je ne connais pas les expressions régulières donc j'ai du chercher un peu pour comprendre ton code
    c'est l'idée

    1/ On ouvre le fichier txt.
    avec open(), et on le lit en intégralité avec read() oui

    2/ On stocke dans la variable data l'ensemble du texte qui comprend le pattern "[ Résumé ]" (pas sûr d'avoir entièrement compris nottement le flag re.DOTALL)
    non, on utilise ici une regex justement, par l'intermédiaire de la fonction re.findall() qui retourne toutes les occurrences de la regex dans une liste (même s'il n'y en a qu'une seule), en l'occurrence ici on demande matcher la regex \[ Résumé \].+, la subtilité vient du .+ à la fin
    en clair on veut matcher ce qui commence par "[ Résumé ]" et se poursuit par "n'importe quels caractères", le flag re.DOTALL spécifie de ne pas s'arrêter justement en fin de ligne \n, en clair on veut prendre tout le contenu du fichier à partir de '[ Résumé ]' (inclus, tout ce qui est avant est donc poubellisé), et on prend la première (et unique) occurrence de la liste retournée par findall() grâce au [0], on met le tout dans data

    3/ On stocke dans la liste "toto" 3 éléments (ceux que l'on souhaitera récupérer par la suite ?)
    ça semble évident.

    4/ On stocke dans rgxp l'objet correspondant au pattern toto (énormément de mal à comprendre ce qu'il se passe mais je comprend que c'est pour l'utiliser dans la commande re.findall juste après)
    j'avoue que c'est un peu astucié ici, concrètement on compile notre regex qu'on appelle rgxp, c'est un procédé qui n'est pas obligatoire (on aurait pu directement tout mettre dans re.findall() sans compiler au préalable) mais qui peut avoir ses avantages, ici le fait de décortiquer permettait de gagner un peu en lisibilité théoriquement
    et on construit notre regex de la façon suivante, admettons qu'on cherche à matcher soit "bla" soit "bouzin" soit "coincoin", on aura alors une regex qui aura une allure du genre (bla|bouzin|coincoin), c'est ce qu'on construit avec le '|'.join(toto) finalement

    5/ On stocke dans "dico" un dictionnaire mais de quoi j'ai du mal à voir.
    ben le dictionnaire (donc une structure de données qui fonctionne sur un mode clé:valeur) équivaut à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> import pprint
    >>> pprint.pprint(dico)
    {u'Service Pack du syst\xe8me': u'Service Pack 1',
     u"Syst\xe8me d'exploitation": u'Windows 7',
     u'Type de syst\xe8me': u'ACPI x64-based PC  (Mobile)'}
    6/ On affiche le dictionnaire
    ouai, plutôt qu'une boucle on aurait très bien pu mettre donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> print dico[u'Service Pack du système']
    Service Pack 1
    >>> print dico[u"Système d'exploitation"]
    Windows 7
    >>> print dico[u'Type de système']
    ACPI x64-based PC  (Mobile)

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Vente
    Inscrit en
    Février 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Vente
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Février 2016
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Merci pour ton aide et tes explications, ça commence à rentrer...

    En récrivant le programme à la main, j'ai toujours la même erreur. Je te met ce qu'affiche la console quand j’exécute si ça peut aider. J'utilise Spyder installé avec Python(x,y) 2.7.10.0 si ça peut avoir une influence.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    runfile('D:/Utilisateurs/XXX/Downloads/Programs/AIDA/sanstitre0.py', wdir='D:/Utilisateurs/XXX/Downloads/Programs/AIDA')
    Traceback (most recent call last):
     
      File "C:\Python27\lib\site-packages\IPython\core\interactiveshell.py", line 2894, in run_code
        self.showtraceback()
     
      File "C:\Python27\lib\site-packages\IPython\core\interactiveshell.py", line 1756, in showtraceback
        value, tb, tb_offset=tb_offset)
     
      File "C:\Python27\lib\site-packages\IPython\core\ultratb.py", line 1190, in structured_traceback
        self, etype, value, tb, tb_offset, context)
     
      File "C:\Python27\lib\site-packages\IPython\core\ultratb.py", line 1107, in structured_traceback
        self, etype, value, elist, tb_offset, context
     
      File "C:\Python27\lib\site-packages\IPython\core\ultratb.py", line 501, in structured_traceback
        out_list.extend(self._format_list(elist))
     
      File "C:\Python27\lib\site-packages\IPython\core\ultratb.py", line 539, in _format_list
        item += '    %s\n' % line.strip()
     
    UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 24: ordinal not in range(128)

    Sinon, pour l'instant j'ai uniquement le bloc "Résumé" dans mon fichier mais imaginons que j'en ai d'autres. Comment faire pour appliquer mon re.findall uniquement sur le bloc "Résumé" et m'arrêter avant le prochain bloc ? L'idée est de traiter uniquement les blocs où je souhaite récupérer de l'info.

  6. #6
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    Citation Envoyé par neliel Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 24: ordinal not in range(128)
    c'est un problème d'encodage, je vais pas pouvoir t'aider plus malheureusement.

    Sinon, pour l'instant j'ai uniquement le bloc "Résumé" dans mon fichier mais imaginons que j'en ai d'autres. Comment faire pour appliquer mon re.findall uniquement sur le bloc "Résumé" et m'arrêter avant le prochain bloc ? L'idée est de traiter uniquement les blocs où je souhaite récupérer de l'info.
    je te renvoie vers n'importe quelle doc décrivant plus en détail le fonctionnement des expressions régulières, celui-cil] par exemple, et à pratiquer évidemment

    dans le principe, on pourrait dire qu'on cherche à matcher ce qui commence par "[ Résumé ]", se poursuit par une série de tirets "-", puis par autre chose qu'un tiret, puis n'importe quel caractère jusqu'à ce qu'on tombe à nouveau sur une série de tirets et un crochet ouvrant "----["
    comprendre le pourquoi du comment est laissé en exercice

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Vente
    Inscrit en
    Février 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Vente
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Février 2016
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Merci pour ton aide. J'ai enfin trouvé le problème décodage (il semble que le .txt soit encodé en ANSI par défaut donc je l'enregistre sous en UTF-8 pour l'instant). Je verrais si c'est possible de traiter directement les .txt en ANSI plus tard.

    Je vais tranquillement avancer sur mon programme en espérant ne pas tomber sur d'autres difficultés.

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

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 608
    Points : 2 072
    Points
    2 072
    Par défaut
    Je ne maîtrise guère les regex mais cela ne te suffirait pas ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    import re
    #with open('FBrxgfClBNI_rapport.txt', 'r') as fichier:
    #    liste_donnees = fichier.readlines()
    with open('FBrxgfClBNI_rapport.txt', 'r') as fichier:
        donnees = fichier.read()
    #print(donnees)
    syst_exp = re.findall(r"Système d'exploitation.+", donnees)[0]
    print(syst_exp)
    mem_syst = re.findall(r"Mémoire système.+", donnees)[0]
    print(mem_syst)
    type_syst = re.findall(r"Type de système.+", donnees)[0]
    print(type_syst)
    Attention, c'est en python 3 : pas de souci d'encodage chez moi.
    Pas d'aide par mp.

Discussions similaires

  1. extraction des données du fichier txt
    Par micha1 dans le forum Entrée/Sortie
    Réponses: 13
    Dernier message: 14/01/2010, 14h28
  2. Extraction de données d'un TXT
    Par PATMA dans le forum Excel
    Réponses: 1
    Dernier message: 27/10/2009, 12h47
  3. extraction de données d'un fichier txt
    Par Sienar dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 11/06/2009, 09h18
  4. Extraction de données à partir de fichiers txt
    Par rob408231 dans le forum MATLAB
    Réponses: 15
    Dernier message: 13/06/2008, 15h17
  5. [VBA Excel] Extraction de données fichier txt vers Excel et mise en forme
    Par newcodeur dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 23/05/2008, 11h45

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