2017-08-24 4 views
0

J'ai un fichier journal qui contient les valeurs de température.
En utilisant ce code, je ne peux extraire que des valeurs de température.Comment obtenir les dernières valeurs d'un fichier journal

code:

import re 
import itertools 

infile = "/home/pi/Mysensor/Logs/test.log" 
for line in open(infile): 
    match = re.search('Temp=(\d+)', line) 
    if match: 
     test = match.group(1) 
     print test 

Mon fichier journal:

2017-08-04 -> 16:14:29 
Temp=28.0* Humidity=36.0% 
sortie Code

:

28 
28 
25 
29 
28 
25 

Ce que je veux faire est, il suffit d'extraire seulement quatre derniers résultats.
J'ai essayé avec les tableaux et la liste. Mais n'a pas pu obtenir de résultat.

Qu'est-ce qui me manque ici?
Comment obtenir ce programme pour obtenir seulement les quatre derniers résultats?

Merci d'avance.

+0

Où sont vos tentatives? Je ne peux pas les voir. L'utilisation d'une liste semble prometteuse. –

Répondre

1

Vous pouvez enregistrer les températures sur une liste, et utiliser des tranches pour obtenir les 4 derniers:

import re 
import itertools 
temps = [] 
infile = "/home/pi/Mysensor/Logs/test.log" 
for line in open(infile): 
    match = re.search('Temp=(\d+)', line) 
    if match: 
     test = match.group(1) 
     temps.append(test) 
print temps[:-5:-1] 

Pour en savoir plus sur les tranches, see this post

+0

Cela a fonctionné parfaitement. – Sachith

1

Je suppose que cela dépend vraiment de la taille de votre journal le fichier est, mais il y a plusieurs façons dont je peux penser à le faire.

Le plus simple est probablement d'utiliser un deque.

from collections import deque 
import re 

temps = deque(maxlen=4) 

infile = "/home/pi/Mysensor/Logs/test.log" 
with open(infile, "r") as fh: 
    for line in fh: 
     match = re.search('Temp=(\d+)', line) 
     if match: 
      temp = match.group(1) 
      temps.append(temp) 
+0

votre réponse se répète, la réponse de Tisp est de me donner la meilleure soulution. – Sachith

+0

Ils parcourent tous les deux. Ils sont presque le même code. La seule différence est que l'utilisation d'un deque signifie que vous n'avez pas à garder tout le tableau en mémoire. L'inconvénient est que vous devez faire une opération pop supplémentaire à chaque étape. Comme je l'ai dit, cela dépend de la taille de votre fichier. – Batman

1

Une approche simple consiste à utiliser la queue de shell linux

1 import os 
    2 
    3 def my_tail(f, n): 
    4  stdin, stdout = os.popen2("tail -n " + str(n) + " "+ f) 
    5  lines = stdout.readlines(); 
    6  return lines 
    7  
    8 print my_tail("./my_log.txt",4) 
+1

C'est sympa, mais suppose que l'utilisateur n'est pas sur Windows. – Batman

+0

@Batman Indeed :) –

+0

@VKShopov Je suis sur Linux, la sortie est '['Temp = 18.0 * Humidité = 36,0% \' n ',' \ n ',' 2017-08-04 -> 16:14:29 \ n ',' Temp = 28.0 * Humidité = 36.0% \ n '] ', juste la dernière ligne. – Sachith

0

Si vous êtes d'accord si une autre langue peut faire la même chose que vous pouvez utiliser les commandes ci-dessous dans un shell bash (en supposant que le le nom du fichier journal est stack.log):

grep 'Temp' pile.log | queue -4 | gawk -F = '{print $ 2}' | gawk '{print $ 1}' | sed s/* // g

Briser les commandes ci-dessus:

  1. grep 'Temp' stack.log -> recherche de chaîne "Temp" dans le fichier journal donné.
  2. tail -4 -> extrait les 4 derniers enregistrements de la sortie des commandes ci-dessus.
  3. gawk -F = '{print $ 2}' -> utilise "=" comme séparateur et imprimer la première colonne, par exemple: 29,0 * Humidité 21,0 * Humidité 22,0 * Humidité 28,0 * Humidité

  4. gawk '{print $ 1}' -> utilise "l'espace" comme séparateur et imprimer la première colonne seule, par exemple: 29,0 *

    21.0 *

    22,0 *

    28,0 *

  5. sed s/g // -> remplacer tous "" (astérisques) avec blanc "" (blanc).

Sortie finale ressemble à:

29,0

21,0

22,0

28,0

Vous peut rediriger à un fichier et lire dans votre programme températures.

+0

Génial, cela fait l'affaire. Mais dans le travail, je me concentre sur python que shell. Merci d'avoir répondu. – Sachith

+0

Merci d'avoir accusé réception. Je vous en prie :) – Rudhin