[PYTHON] analyser pour le format, pour Jinja2 ...?

parse() is the opposite of format() https://pypi.python.org/pypi/parse

J'ai appris qu'il existe un moyen de créer un dictionnaire python, etc. à partir d'une chaîne de caractères de modèle en faisant l'inverse du format

Je veux faire correspondre plusieurs lignes

J'ai template.txt et result.txt, et je veux combiner les parties `` {} '' de template.txt dans un dictionnaire.

Cependant, result.txt capture également toutes les autres sorties standard, etc., il est volumineux dans une certaine mesure et il est difficile de créer tout le template.txt. Même si ce n'est pas le cas, il y a des lignes qui changent d'une exécution à l'autre (mais qui ne sont pas assez importantes pour les obtenir toutes), telles que les journaux de date et d'heure d'exécution.

Jusqu'à présent, je voulais le rendre un peu plus facile que je ne le faisais à moitié manuellement à chaque fois avec un script shell utilisant awk ou sed.

Ce que j'ai fait

Une image qui analyse chaque ligne de template.txt tout en la repliant dans chaque ligne de result.txt, et combine et extrait toutes les lignes correspondantes. La carte et la réduction ne s'arrêtent pas même si None apparaît au milieu, donc c'est très gaspilleur, mais si vous ne recherchez pas les performances à ce point ... (Je n'ai pas réussi avec une double boucle ...: persévérez :)

from parse import *
from parse import compile

def coerce_res(a, b):
   try:
      a.named.update(b.named)
      a.fixed = a.fixed + b.fixed
      return a
   except:
      return None

def match():
   with open('template.txt', 'r') as ftemp, open('result.txt', 'r') as flog:
      templines = ftemp.readlines()
      # todo: remove leading & trailing blank lines from templines
      loglines = flog.readlines()

      for i in range(len(loglines) - len(templines) + 1):
         a = map(lambda (x,y) : parse(x,y), zip(templines, loglines[i:]))
         b = reduce(coerce_res, a)

         if(b):
            return b

print match()
# print fixed, named

Le résumé est généralement à la fin, il semble donc plus rapide de le faire de la fin

ce que je veux

parse est la conversion inverse du format, mais s'il y a quelque chose comme la conversion inverse de Jinja2, je pense qu'il y a un utilisateur, mais y a-t-il une telle chose? Dans le journal au moment de l'exécution, décrivez la partie dont vous ne savez pas exactement combien de lignes vont apparaître avec quelque chose comme {% for%} '' et affichez-la sous forme de liste. Placez le journal qui apparaît uniquement au moment de l'échec dans un bloc {% if%} '' pour détecter l'échec. (Au fait, je n'ai jamais utilisé Jinja auparavant, donc j'en parle complètement.)

Recommended Posts

analyser pour le format, pour Jinja2 ...?
[Python 2/3] Analyser la chaîne de format
Utiliser Jinja2 pour le moteur de modèle PasteScript
Optimisation de la Bbox pour les ensembles de données personnalisés [format COCO]