Hintergrundinformationen
Ich habe ein Python-Skript, das Word-Dokumente mit dem docx
-Modul generiert. Diese Dokumente werden basierend auf einem Protokoll erstellt und dann gedruckt und als Datensätze gespeichert. Das Protokoll kann jedoch rückwirkend bearbeitet werden, sodass die Belegsätze überarbeitet werden müssen und diese Revisionen verfolgt werden müssen. Ich überarbeite nicht wirklich die Dokumente, sondern erzeuge eine neue, die den Unterschied zwischen dem, was gerade im Protokoll ist, und dem, was bald in dem Protokoll sein wird, anzeigt (das Protokoll wird aktualisiert, nachdem die überarbeitete Datei gedruckt wurde). Wenn eine Revision stattfindet, verwendet mein Skript diff_match_patch
, um eine Markierung dessen zu generieren, was sich mit der folgenden Funktion geändert hat:
docx
kann Text entweder als Zeichenketten oder als Tupel verwenden, wenn eine Formatierung von Wort zu Wort erforderlich ist, also [siehe zweites Aufzählungszeichen in "Einige Dinge, die Sie beachten sollten]]
erzeugt
Hallo mein Name
ist Brad
Das Problem
diff_match_patch
ist ein sehr effizienter Code, der den Unterschied zwischen zwei Texten findet. Leider ist es ein wenig zu effizient, daher ersetzt redundant
durch dune
in
redunante
Das ist hässlich, aber es ist gut für einzelne Wörter. Wenn jedoch ein gesamter Absatz ersetzt wird, sind die Ergebnisse vollständig nicht lesbar. Das ist nicht in Ordnung.
Früher habe ich das angesprochen, indem ich den gesamten Text in einen einzigen Absatz zusammengefasst habe, aber das war weniger als ideal, weil es sehr unübersichtlich wurde und immer noch ziemlich hässlich war.
Die Lösung bisher
Ich habe eine Funktion, die das Revisionsdokument erstellt. Diese Funktion erhält eine Liste von Tupeln, die wie folgt aufgebaut sind:
%Vor%Also ist das Dokument als
eingerichtet %Vor%Ich nehme an, um das Problem zu lösen, muss ich eine Art von Übereinstimmung zwischen Absätzen tun, um sicherzustellen, dass ich nicht zwei völlig separate Absätze differiere. Ich gehe auch davon aus, dass die Übereinstimmung davon abhängt, ob Absätze hinzugefügt oder entfernt werden. Hier ist der Code, den ich bisher habe:
%Vor% Bisher habe ich geplant, etwas wie difflib
zu verwenden, um einen Absatzabgleich durchzuführen. Aber wenn es einen besseren Weg gibt, dieses Problem zu vermeiden, ist das ein ganz anderer Ansatz, das ist auch großartig.
Einige Dinge, die Sie beachten sollten:
docx
vorgenommen (das heißt, den Strike durch Formatierung hinzufügen). Wenn Sie also diesen Code testen, können Sie nicht replizieren, was ich in diesem Zusammenhang mache Beschreibung des gesamten Prozesses (mit den Überarbeitungsschritten in Fettdruck):
1) Der Benutzer öffnet das Python-Skript und verwendet die GUI, um Informationen zu einem sogenannten Zustandsbericht (CR) hinzuzufügen
HINWEIS: Ein vollständiger CR enthält 4 Teile, die alle von verschiedenen Personen ausgefüllt wurden. Aber jeder Teil wird einzeln gedruckt. Alle 4 Teile sind zusammen im Protokoll gespeichert
2) Wenn der Benutzer fertig ist, werden die Informationen in einem Protokoll (unten beschrieben) gespeichert und dann als .docx
Datei
3) Das gedruckte Dokument wird signiert und gespeichert
4) Wenn der Benutzer einen Teil des CR revidieren möchte, öffnet er die GUI und bearbeitet die Informationen in jedem der Felder. Ich bin nur besorgt über einige der Felder in dieser Frage, und das sind die mehrzeiligen Textsteuerelemente (die zu mehreren Absätzen führen können)
5) Sobald der Benutzer mit der Revision fertig ist, generiert der Code die Tupel-Liste, die ich im Abschnitt "Solution So Far" beschrieben habe, und sendet diese an die Funktion, die das Revisionsdokument generiert / p>
6) Das Revisionsdokument wird erstellt, gedruckt, signiert und zusammen mit dem Originaldokument für diesen Teil des CR gespeichert.
7) Das Protokoll wird vollständig neu geschrieben, um die überarbeiteten Informationen zu enthalten
Das Protokoll:
Das Protokoll ist einfach eine riesige dict
, die alle Informationen auf allen CRs speichert. Das allgemeine Format ist
Das Protokoll speichert keine früheren Versionen einer CR. Wenn eine CR überarbeitet wird, werden die alten Informationen überschrieben (was wir für das System wollen). Wie ich bereits erwähnt habe, wird jedes Mal, wenn das Protokoll bearbeitet wird, das Ganze neu geschrieben. Um an die Informationen im Log zu kommen, habe ich import
it (da es immer im selben Verzeichnis wie das Skript lebt)
Versuchen Sie, die post-diff Aufräumoptionen zu verwenden, die diff_match_patch, das oben erwähnt wurde, insbesondere die diff_cleanupSemantic
-Funktion auschecken, die verwendet werden soll, wenn die diff-Ausgabe für Menschen lesbar sein soll.
Bereinigungsoptionen werden NICHT automatisch ausgeführt, da diff_match_patch mehrere Bereinigungsoptionen bietet, aus denen Sie auswählen können (abhängig von Ihren Anforderungen).
Hier ist ein Beispiel:
%Vor%Ausgabe:
%Vor%Wie Sie sehen können, ist das erste diff optimal, aber unlesbar, während das zweite diff (nach der Bereinigung) genau das ist, wonach Sie suchen.
Erwägen Sie die Verwendung von Git, um alle diese Revisionen zu verwalten, siehe GitPython für eine Python api, siehe auch Git (oder Hg) -Plugin für den Umgang mit Microsoft Word- und / oder OpenOffice-Dateien , wie man xmldiff verwendet und ein Element pro Zeile hat
Tags und Links python