[PYTHON] Für Format analysieren, für Jinja2 ...?

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

Ich habe gelernt, dass es eine Möglichkeit gibt, aus einer Vorlagenzeichenfolge ein Python-Wörterbuch usw. zu erstellen, indem das Format umgekehrt wird

Ich möchte mehrere Zeilen abgleichen

Ich habe template.txt und result.txt und möchte die {} Teile in template.txt zu einem Wörterbuch kombinieren.

Die Datei result.txt erfasst jedoch auch alle anderen Standardausgaben usw., ist zum Teil groß und es ist schwierig, die gesamte template.txt zu erstellen. Auch wenn dies nicht der Fall ist, gibt es Zeilen, die sich von Lauf zu Lauf ändern (aber nicht wichtig genug sind, um alle zu erhalten), z. B. Datums- und Laufzeitprotokolle.

Bisher wollte ich es ein wenig einfacher machen, als ich es jedes Mal mit einem Shell-Skript mit awk oder sed halb manuell gemacht habe.

Was ich getan habe

Ein Bild, das jede Zeile von template.txt analysiert, während es in jede Zeile von result.txt gefaltet wird, und alle übereinstimmenden Zeilen kombiniert und extrahiert. Sowohl Map als auch Reduce hören nicht auf, auch wenn None in der Mitte angezeigt wird. Dies ist sehr verschwenderisch, aber wenn Sie keine Leistung in diesem Ausmaß anstreben ... (Ich habe es mit einer Doppelschleife nicht richtig gemacht ...: durchhalten :)

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

Die Zusammenfassung befindet sich normalerweise am Ende, daher scheint es am Ende schneller zu sein

was ich möchte

Parse ist die umgekehrte Konvertierung des Formats, aber wenn es so etwas wie die umgekehrte Konvertierung von Jinja2 gibt, denke ich, dass es einen Benutzer gibt, aber gibt es so etwas? Beschreiben Sie im Protokoll zum Zeitpunkt der Ausführung den Teil, von dem Sie nicht genau wissen, wie viele Zeilen mit so etwas wie "{% für%}" angezeigt werden, und geben Sie ihn als Liste aus. Schließen Sie das Protokoll, das nur zum Zeitpunkt des Fehlers angezeigt wird, in einen {% if%} Block ein, um den Fehler zu erkennen. (Übrigens habe ich Jinja noch nie benutzt, also spreche ich komplett darüber.)

Recommended Posts

Für Format analysieren, für Jinja2 ...?
[Python 2/3] Analysiert die Formatzeichenfolge
Verwenden Sie Jinja2 für die PasteScript-Vorlagen-Engine
Bbox-Optimierung für benutzerdefinierte Datensätze [COCO-Format]