Ho cercato molto per trovare e sostituire un testo in un file docx con un po 'di fortuna. Ho provato il modulo docx e non ho potuto farlo funzionare. Alla fine ho elaborato il metodo descritto di seguito utilizzando il modulo zipfile e sostituendo il file document.xml nell'archivio docx. Affinché ciò funzioni, è necessario un documento modello (docx) con il testo che si desidera sostituire come stringhe univoche che non potrebbero eventualmente corrispondere a nessun altro testo esistente o futuro nel documento (ad esempio "L'incontro con XXXCLIENTNAMEXXX su XXXMEETDATEXXX è andato molto bene. ").Trova e sostituisci testo nel file .docx - Python
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()
La mia domanda è cosa c'è di sbagliato in questo metodo? Sono abbastanza nuovo a questa roba, quindi credo che qualcun altro avrebbe dovuto già capirlo. Il che mi porta a credere che ci sia qualcosa di molto sbagliato in questo approccio. Ma funziona! Cosa mi manca qui?
.
Ecco una guida del mio processo di pensiero per tutti gli altri cercando di imparare questa roba:
Fase 1) Preparare un dizionario Python delle stringhe di testo che si desidera sostituire come chiavi e il nuovo testo come elementi (ad esempio . {"XXXCLIENTNAMEXXX": "Joe Bob", "XXXMEETDATEXXX": "31 maggio 2013"}).
Passaggio 2) Aprire il file docx del modello utilizzando il modulo zipfile.
Passaggio 3) Aprire un nuovo nuovo file docx con la modalità di accesso append.
Passaggio 4) Estrarre il file document.xml (dove tutto il testo è presente) dal file docx del modello e leggere l'xml in una variabile di stringa di testo.
Passaggio 5) Utilizzare un ciclo for per sostituire tutto il testo definito nel dizionario nella stringa di testo xml con il nuovo testo.
Passaggio 6) Scrivere la stringa di testo xml in un nuovo file xml temporaneo.
Passaggio 7) Utilizzare un ciclo for e il modulo zipfile per copiare tutti i file nell'archivio del modello docx in un nuovo archivio docx TRANNE il file word/document.xml.
Passaggio 8) Scrivere il file xml temporaneo con il testo sostituito nel nuovo archivio docx come nuovo file word/document.xml.
Passaggio 9) Chiudere il modello e i nuovi archivi docx.
Passo 10) Apri il tuo nuovo documento docx e goditi il testo sostituito!
--Edit-- mancante chiusura parentesi ')' sulle linee 7 e 11
Intendi che il codice che hai pubblicato funziona e ti stai chiedendo, "Perché nessun altro l'ha fatto?" Forse qualcuno lo ha fatto. Perché questo sarebbe un problema? Da una rapida occhiata al tuo codice, sembra la cosa giusta da fare. –
Ovviamente le persone lo hanno già fatto. Questa è un'implementazione barebone di una lettera tipo. Microsoft Word (e OpenOffice e così via) hanno una funzione "Stampa unione" che lo farà in modo nativo. –
Questa domanda sembra essere off-topic perché riguarda la revisione del codice funzionante. Consiglia la migrazione a codereview.SE –