Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 21/11/2010, à 17:01

wido

[python] parser du texte(résolu)

J'ai un texte qui ce présente comme ceci:


==============NVSMI LOG==============


Timestamp            : Sun Nov 21 15:44:11 2010

Driver Version            : 260.19.21


GPU 0:
    Product Name        : GeForce 8800 GTS 512
    PCI Device/Vendor ID    : 60010de
    PCI Location ID        : 0:4:0
    Board Serial        : 125426475920
    Display            : Connected
    Temperature        : 61 C
    Fan Speed        : 37%
    Utilization
        GPU            : 0%
        Memory        : 0%

et par exemple je voudrais récupérer la température? quelles sont les commandes que je dois exécuter pour récupérer cette valeur?

Dernière modification par wido (Le 21/11/2010, à 21:55)

Hors ligne

#2 Le 21/11/2010, à 17:17

g_barthe

Re : [python] parser du texte(résolu)

si ton fichier a toujours la même forme tu peux mettre toutes les données dans des listes et récupérer l'élément voulu (tu connais son numéro) donc sa valeur et après tu peux extraire le nombre de caractère que tu veux.
C'est un peu basique mais ca devrait marcher.

Après si c'est pour utiliser la valeur de la température du processeur, il y a peut être déjà une librairie qui permet cela ca éviterait de retravailler un tel fichier.

Regarde du coté des plasmoids existant peut être pour voir comment ils font s'ils sont prog en python.


Mon forum perso sur le génie climatique http://le-genie-climatique.positifforum.com/
Le forum des travaux manuels : http://pausebroderie.fr/

Hors ligne

#3 Le 21/11/2010, à 18:46

wido

Re : [python] parser du texte(résolu)

C'est plus dans le but de m'exercer sous python étant débutant smile, pour sed,awk aucun problème mais c'est la manière de faire que je n'arrive pas sous python.

Hors ligne

#4 Le 21/11/2010, à 19:25

Jules Petibidon

Re : [python] parser du texte(résolu)

Y'a pas de gros "truc" pour le genre de fichier que tu présentes.
Si tu veux t'exercer, au lieu de simplement chercher un valeur, tu peux essayer d'analyser tout ton fichier pour le transformer en objet potentiellement exploitable au sein d'un programme.

Perso je passerais par de l'analyse bête et méchante :

Python lit les fichiers "naturellement" ligne par ligne.

fichier = open("monFichier" , "r" )
for ligne in fichier:
    #traitement ligne

A partir de là, c'est simple si ton fichier est structuré correctement. Par exemple avec des tabulations
base d'algo :
si ligne ne commence pas par 'tab' -> créer un nouvel objet -> enregistrer cet objet dans une liste.
sinon peupler l'objet précédemment créé.
à raffiner ensuite pour splitter les clés/valeurs (str.split() ), nettoyer les espaces et tabulations inutiles ( str.strip() )

Si ça t'intéresse j'ai créé une petite classe dans le style de ce que tu veux faire, pour un petit utilitaire de synchro en python, qui analyse un fichier "style yaml" pour l'exploiter. Je suis pas un cador de python mais ça peut être un bon exemple d'analyse bête et méchante.

Hors ligne

#5 Le 21/11/2010, à 20:24

HP

Re : [python] parser du texte(résolu)

Complètement d'accord avec Jules Petibidon !
En plus c'est le type de code qui sera probablement le plus explicite et, donc, le plus maintenable…


cat /dev/urandom >/dev/null 2>&1 #github

Hors ligne

#6 Le 21/11/2010, à 21:33

k3c

Re : [python] parser du texte(résolu)

En reprenant l'idée d'ouvrir le fichier et de traiter ligne par ligne...

Le module string et le slicing sont utiles pour ce genre de chose.

http://www.swaroopch.com/notes/Python_f … nn%C3%A9es

gg@cedre:~$ more a.py
#!/usr/bin/python
# -*- coding: utf-8 -*-

fichier = open("aa.txt" , "r" )
for ligne in fichier:
   if "Temperature" in ligne:
    line = ligne.split()
    print line[:1]
gg@cedre:~$ more aa.txt


Timestamp            : Sun Nov 21 15:44:11 2010

Driver Version            : 260.19.21


GPU 0:
    Product Name        : GeForce 8800 GTS 512
    PCI Device/Vendor ID    : 60010de
    PCI Location ID        : 0:4:0
    Board Serial        : 125426475920
    Display            : Connected
    Temperature        : 61 C
    Fan Speed        : 37%
    Utilization
        GPU            : 0%
        Memory        : 0%

gg@cedre:~$ python a.py
['Temperature']
gg@cedre:~$

Dernière modification par k3c (Le 21/11/2010, à 21:34)


Archlinux sur Xiaomi Air 13

Hors ligne

#7 Le 21/11/2010, à 21:53

wido

Re : [python] parser du texte(résolu)

fichier = open('monfichier',"r")
for ligne in fichier:
    if "Temperature" in ligne:
        line = ligne.split()
        print("Temperature:",line[-2])

    if "Fan Speed" in ligne:
        line = ligne.split()
        print("Fan Speed :",line[-1])
Temperature: 61
Fan Speed : 37%

c'est pas mal smile

Merci à vous tous

Dernière modification par wido (Le 21/11/2010, à 21:55)

Hors ligne

#8 Le 24/11/2010, à 00:07

AnsuzPeorth

Re : [python] parser du texte(résolu)

Bjr,
J'avais envie de troller ...

J'aime beaucoup python, mais pour certain traitement, rien ne vaut les commandes unix ....

grep -A 1 Temperature fichier.txt

On dénigre le bash et les commandes unix au profit de languages, certes plus puissants, mais que je trouve inapproprié pour certain cas, là,  y'a pas photo smile


Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script  (Hors ligne)

Hors ligne

#9 Le 08/12/2010, à 09:43

HP

Re : [python] parser du texte(résolu)

AnsuzPeorth a écrit :

J'aime beaucoup python, mais pour certain traitement, rien ne vaut les commandes unix ...

# time python gvfs-test.py
{'icons': [u'drive-removable-media-usb',
           u'drive-removable-media',
           u'drive-removable',
           u'drive'],
 'name': u' Generic- SM/xD/SD/MMC/MS',
 'type': u' GProxyDrive (GProxyVolumeMonitorGdu)',
 'unix': u" '/dev/sdc'",
 'volumes': []}
{'icons': [u'drive-removable-media-file',
           u'drive-removable-media',
           u'drive-removable',
           u'drive'],
 'name': u' Fichier 673 MB',
 'type': u' GProxyDrive (GProxyVolumeMonitorGdu)',
 'unix': u" '/dev/loop0'",
 'volumes': [<__main__.Volume object at 0x7f8610a014d0>]}
{'icons': [u'drive-optical', u'drive'],
 'name': u' Lecteur CD/DVD',
 'type': u' GProxyDrive (GProxyVolumeMonitorGdu)',
 'unix': u" '/dev/sr0'",
 'volumes': []}
{'icons': [u'drive-harddisk-usb', u'drive-harddisk', u'drive'],
 'name': u' Disque dur 80 GB',
 'type': u' GProxyDrive (GProxyVolumeMonitorGdu)',
 'unix': u" '/dev/sde'",
 'volumes': [<__main__.Volume object at 0x7f8610a01810>]}
{'icons': [u'drive-removable-media-usb',
           u'drive-removable-media',
           u'drive-removable',
           u'drive'],
 'name': u' HP v135w',
 'type': u' GProxyDrive (GProxyVolumeMonitorGdu)',
 'unix': u" '/dev/sdd'",
 'volumes': [<__main__.Volume object at 0x7f8610a01910>]}

real    0m0.030s
user    0m0.030s
sys    0m0.000s

Parsage de gvfs-mount -li en fait, je n'obtiens que des objets, mais ils sont montrés là sous forme de dictionnaires (sauf pour les listes qu'ils peuvent contenir) puisque obj.__dict__ n'est pas récursif.
Faut quand même dire, que quand tu as quelques chose comme çà, c'est plus facile à exploiter et plus versatile que le résultat de n'importe quel grep ! tongue
En plus, tu peux facilement le mettre en cache (sérialisation), par exemple en te basant sur les modifications de /dev/disk/ ; après, c'est sûr… bash c'est pas pour le développement, mais çà, on le savait déjà ! wink tongue

Dernière modification par HP (Le 08/12/2010, à 09:45)


cat /dev/urandom >/dev/null 2>&1 #github

Hors ligne

#10 Le 19/12/2010, à 15:33

HP

Re : [python] parser du texte(résolu)

Portage d'un autre script (pour mettre à jour firefox nightly depuis la ligne de commande)…
Pour le moment j'en suis aux requêtes HTTP pour récupérer la liste de fichiers, comparer les entêtes avec le fichier local… etc…
Donc en Bash :

real    0m5.960s
user    0m0.220s
sys    0m0.040s

Et en Python :

real    0m2.280s
user    0m0.150s
sys    0m0.020s

Sur les mêmes opérations… je pense que jusqu'à la fin, Python explosera Bash…
Déjà j'évite d'utiliser curl par deux fois… faut pas trop s'étonner du gain ! Sans compter que les regex c'est un peu plus propre que les coups de awk/sed/tr/grep ou autres… non, Bash c'est sympa dans un terminal ou un tout petit script ; mais vraiment pas plus ! wink


cat /dev/urandom >/dev/null 2>&1 #github

Hors ligne

#11 Le 19/12/2010, à 18:25

AnsuzPeorth

Re : [python] parser du texte(résolu)

Sur les mêmes opérations… je pense que jusqu'à la fin, Python explosera Bash…

J'ai jamais dit que bash était plus rapide en execution que python, je dis juste que bash et ses outils s'utilsent plus simplement et s'écrit avec moins de caractères que le python pour certaines choses ( j'ai été assez clair ce coup ci ? ).
La question initiale du thread, il fallait récupérer la ligne de la température dans un fichier texte. Dans ce cas si, sans parler de rapidité, mais de simplicité, tu en conviendras qu'un grep est plus aisé que python, et beaucoup plus court à écrire ?
Par exemple pour chercher un type de fichier dans l'arborescence, il est plus simple d'utilser la complétion offerte par bash 4 qu'une boucle python !

Sans compter que les regex c'est un peu plus propre que les coups de awk/sed/tr/grep ou autres…

De toute façons, vu la consommation d'un regex, autant éviter, bash offre de belle chose avec la substituion, mais sera surement plus lent que python (jamais fait d'essais dans ce sens).

non, Bash c'est sympa dans un terminal ou un tout petit script ; mais vraiment pas plus !

On ne peut pas le réduire uniquement à ça. Si ton script ne comporte que des comparaison simples, qqles boucles et principalement des commandes systèmes, je trouve que bash est plus appproprié, sans vouloir non plus faire une usine à gaz, dans ce cas, python est bien plus 'propre', c'est sur !

Je trouve que chaque language à sa place,son utilité, on ne peut pas vraiment comparer ! Bash a comme attout sa relative simplicité, sa rapidité d'écriture et sa "connexion directe au système" (je veux dire par là toutes le commande qu'on devrait passer par subprocess en python). Python est plus costaud, plus lisible donc plus simple à maintenir, et il faut pas oublié qu'il est orienté objet, donc rien à voir !

Dernière modification par AnsuzPeorth (Le 19/12/2010, à 18:26)


Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script  (Hors ligne)

Hors ligne

#12 Le 19/12/2010, à 21:01

HP

Re : [python] parser du texte(résolu)

AnsuzPeorth a écrit :

Sans compter que les regex c'est un peu plus propre que les coups de awk/sed/tr/grep ou autres…

De toute façons, vu la consommation d'un regex, autant éviter, bash offre de belle chose avec la substituion, mais sera surement plus lent que python (jamais fait d'essais dans ce sens).

Pour les regex, la consommation est sûrement proportionnelle et à la quantité de texte à analyser et à la qualité du pattern… donc, je ne pense pas que ce soit vraiment « dramatique ».

La substitution, ça n'a pas grand chose à voir, si l'on ne cherche pas dans une arborescence du FS mais sur le contenu d'une variable… donc, non, là on s'en moque de celle de Bash, puisque ça n'a rien à voir. Par contre, il y a le même type de complétion dans Python pour les chemins de fichiers/dossisers… donc, ouais, encore un truc de moins qui soit une feature unique de Bash vs Python. Non, je persiste : c'est juste bon pour de petits scripts…

Le problème des subprocess est un faux problème parce que la nécessité de l'emploi de binaires externes est très rare en Python… cependant l'utilisation de subprocess est aisée pour peu que l'on s'en donne la peine.

Dernière modification par HP (Le 19/12/2010, à 21:03)


cat /dev/urandom >/dev/null 2>&1 #github

Hors ligne

#13 Le 19/12/2010, à 23:59

AnsuzPeorth

Re : [python] parser du texte(résolu)

Ôuais ... On va dire que tu as raison, je ne comprends même pas pourqoui je perds du temps dans ce genre de conversation !
Donc pour résumer, python c'est le meilleur des languages et le bash c'est une grosse bouse qui ne sert à rien, à part faire des scripts de 2 lignes, c'est bien pour ça qu'on en trouve en profusion dans les distrib linux ...!


Enfin ... Baste !

ps: te fatigue pas à répondre, je me désabonne du sujet wink


Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script  (Hors ligne)

Hors ligne