查找并替换.docx文件中的文本-Python

查找并替换.docx文件中的文本-Python,python,text,replace,docx,zipfile,Python,Text,Replace,Docx,Zipfile,我一直在寻找一种方法来查找和替换docx文件中的文本,但运气不好。我已经尝试了docx模块,但无法使其工作。最后,我使用zipfile模块并替换docx归档中的document.xml文件,找到了下面描述的方法。为此,您需要一个模板文档(docx),其中包含要替换为唯一字符串的文本,该字符串不可能与文档中的任何其他现有或未来文本匹配(例如,“与XXXCLIENTNAMEXXX在XXXMEETDATEXXX上的会议进行得非常顺利”) 我的问题是这种方法有什么问题?我对这件事还很陌生,所以我觉得应该

我一直在寻找一种方法来查找和替换docx文件中的文本,但运气不好。我已经尝试了docx模块,但无法使其工作。最后,我使用zipfile模块并替换docx归档中的document.xml文件,找到了下面描述的方法。为此,您需要一个模板文档(docx),其中包含要替换为唯一字符串的文本,该字符串不可能与文档中的任何其他现有或未来文本匹配(例如,“与XXXCLIENTNAMEXXX在XXXMEETDATEXXX上的会议进行得非常顺利”)

我的问题是这种方法有什么问题?我对这件事还很陌生,所以我觉得应该有人已经知道了。这让我相信这种方法有很大的问题。但它是有效的!我错过了什么

以下是我的思考过程,供其他试图学习这些东西的人参考:

步骤1)准备一个Python字典,其中包含要替换为键的文本字符串和要替换为项的新文本(例如{“XXXCLIENTNAMEXXX:“Joe Bob”,“XXXMEETDATEXXX:“2013年5月31日”})

步骤2)使用zipfile模块打开模板docx文件

步骤3)使用附加访问模式打开新的docx文件

步骤4)从模板docx文件中提取document.xml(所有文本都存在于其中),并将xml读入文本字符串变量

步骤5)使用for循环将字典中xml文本字符串中定义的所有文本替换为新文本

步骤6)将xml文本字符串写入新的临时xml文件

步骤7)使用for循环和zipfile模块将模板docx归档文件中的所有文件复制到新的docx归档文件(word/document.xml文件除外)

步骤8)将带有替换文本的临时xml文件作为新的word/document.xml文件写入新的docx归档文件

步骤9)关闭模板和新的docx存档

第10步)打开新的docx文档,欣赏替换的文本


--编辑--在第7行和第11行缺少右括号“)”有时,Word会做一些奇怪的事情您应该尝试删除文本并一笔重写,例如不编辑中间的文本

您的文档保存在一个xml文件中(对于docx,解压后通常保存在word/document.xml中)。有时,您的文本可能不在一个笔划中:可能在文档中的某个地方,它们是XXXCLIENT,而在其他地方,它们的名称是xxx

大概是这样的:


XXX客户
...
姓名XXX

这种情况经常发生,因为语言支持:当他认为一个单词属于一种特定语言时,word会拆分单词,并且可能在单词之间拆分,这会将单词拆分为多个标记

您的解决方案唯一的问题是,您必须一笔完成所有内容,这不是最方便用户的

我已经创建了一个JS库,它使用类似胡须的标记:{clientName}


它的全局工作原理与您的算法相同,但如果内容不在一个笔划中,则不会崩溃(当您在Word中编写{clientName}时,文本通常会被拆分:{,clientName,}在文档中。

您可以尝试一种解决方法。使用Word的搜索/替换在一个笔划中获取文本


例如,搜索
“XXXCLIENTNAMEXXX”
并再次将其替换为
“XXXCLIENTNAMEXXX”

您的意思是您发布的代码有效,您会问,“为什么其他人没有这样做?”也许有人这样做了。为什么会有问题呢?粗略地看一下你的代码,这看起来是正确的做法。当然人们以前也这样做过。这是一个表单信函的基本实现。Microsoft Word(和OpenOffice等)有一个“邮件合并”本机执行此操作的函数。此问题似乎与主题无关,因为它是关于检查工作代码的。建议迁移到codereview.SE
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()