Suchen und ersetzen von text in .docx-Datei - Python

Ich habe dabei eine Menge von der Suche nach einer Methode, um suchen und ersetzen von text in eine docx-Datei mit etwas Glück. Ich habe versucht, die docx-Modul und könnte nicht funktionieren. Schließlich habe ich die unten beschriebene Methode mit der zipfile-Modul und ersetzen Sie die document.xml Datei im docx-Archiv. Für diese Arbeit benötigen Sie ein template-Dokument (docx) mit dem text, den Sie ersetzen möchten als einzigartige Zeichenfolgen, war es nicht möglich, die mit keinem anderen bestehenden oder zukünftigen text in das Dokument (zB. "Die Begegnung mit XXXCLIENTNAMEXXX auf XXXMEETDATEXXX sehr gut gelaufen.").

import zipfile

replaceText = {"XXXCLIENTNAMEXXX" : "Joe Bob", "XXXMEETDATEXXX" : "May 31, 2013"}
templateDocx = zipfile.ZipFile("C:/Template.docx")
newDocx = zipfile.ZipFile("C:/NewDocument.docx", "a")

with open(templateDocx.extract("word/document.xml", "C:/")) as tempXmlFile:
    tempXmlStr = tempXmlFile.read()

for key in replaceText.keys():
    tempXmlStr = tempXmlStr.replace(str(key), str(replaceText.get(key)))

with open("C:/temp.xml", "w+") as tempXmlFile:
    tempXmlFile.write(tempXmlStr)

for file in templateDocx.filelist:
    if not file.filename == "word/document.xml":
        newDocx.writestr(file.filename, templateDocx.read(file))

newDocx.write("C:/temp.xml", "word/document.xml")

templateDocx.close()
newDocx.close()

Meine Frage ist, was ist falsch mit dieser Methode? Ich bin ziemlich neu auf dieses Zeug, so dass ich das Gefühl jemand anderes haben sollte, erkannt bereits. Das führt mich zu glauben, es ist etwas sehr falsch mit diesem Ansatz. Aber es funktioniert! Was vermisse ich hier?

.

Hier ist eine Exemplarische Vorgehensweise, meine Gedanken für alle anderen, die versuchen zu lernen dieses Zeug:

Schritt 1) Bereiten Sie ein Python-dictionary des text-strings, die Sie ersetzen möchten, und als Schlüssel und den neuen text posten (zB. {"XXXCLIENTNAMEXXX" : "Joe Bob", "XXXMEETDATEXXX" : "Mai 31, 2013"}).

Schritt 2) Öffnen Sie die Vorlage docx-Datei mit der zipfile-Modul.

Schritt 3) Öffnen Sie eine neue neue docx-Datei mit dem append-Zugriff-Modus.

Schritt 4) Extrahieren Sie die document.xml (da wo der text lebt) aus der Vorlage docx-Datei, und Lesen der xml-Daten in eine text-Zeichenfolge-variable.

Schritt 5) Verwenden Sie eine for-Schleife zu ersetzen Sie alle den definierten text in Ihrem Wörterbuch die in der xml-Zeichenfolge mit den neuen text ein.

Schritt 6) Schreiben der xml-text-Zeichenfolge, um eine neue temporäre xml-Datei.

Schritt 7. Verwenden Sie eine for-Schleife und das zipfile-Modul zum kopieren aller Dateien in die Vorlage docx-Archiv in einen neuen docx-Archiv, AUßER die word/document.xml Datei.

Schritt 8) Schreiben der temporären xml-Datei mit den ersetzten text auf das neue docx-Archiv als eine neue word/document.xml Datei.

Schritt 9) Schließen Sie Ihre Vorlage und neue docx-Archive.

Schritt 10) Öffnen Sie Ihr neues docx Dokument und genießen Sie Ihren text ersetzt!

--Edit-- es Fehlen schließende Runde Klammer ')' nach den Linien 7 und 11

  • Du meinst den code, den Sie geschrieben funktioniert und Sie Fragen, "Warum hat nicht jemand anderes das getan?" Hat jemand vielleicht. Warum sollte das ein problem sein? Bei einem kursorischen Blick auf deinen code sieht es so aus das richtige zu tun.
  • Natürlich die Leute dies getan haben, bevor. Dies ist ein Barebone-Umsetzung einer Serienbrief. Microsoft Word (und OpenOffice und etc) haben eine "Mail Merge" - Funktion, die diese nativ.
  • Diese Frage scheint off-topic, weil es um die Beurteilung von Arbeits-code. Empfehlen die migration zu codereview.SE
InformationsquelleAutor cvdellen | 2013-05-31
Schreibe einen Kommentar