我有一个docx文件,它包含很多部分之间的新行,我需要在不止一次连续出现时清除一个新行。我使用以下方法解压缩文件:
z = zipfile.ZipFile('File.docx','a')
z.extractall()
目录内:word,是一个文件document.xml,它包含所有数据,但我不知道如何在xml中知道新行。
我知道提取它不是解决方案(我这里只用来显示文件的位置)。我想我可以使用:
z.write('Document.xml')
任何人都可以帮助我吗?
答案 0 :(得分:1)
来自tlewis的代码用于从docx中查找特定文本并替换它。在您的情况下,还有其他事情可做:检测新行,并查看它们是否连续超过两行。换句话说,换行符只是一个段落(<w:p>
标记),里面没有任何文字。
我添加了一些评论,告诉您如何使用zip。
import zipfile #Import the zip Module
from lxml import etree #Useful to transform string into xml, and xml into string
templateDocx = zipfile.ZipFile("C:/Template.docx") #Here is the path to the file you want to import
newDocx = zipfile.ZipFile("C:/NewDocument.docx", "a") #This is the name of the outputed file
#Open the document.xml file, the file that contains the content
with open(templateDocx.extract("word/document.xml", "C:/") as tempXmlFile:
tempXmlStr = tempXmlFile.read()
tempXmlXml= etree.fromstring(tempXmlStr) #Convert the string into XML
############
# Algorithm detailled at the bottom,
# You have to write here the code to select all <w:p> tags, look if there is a <w:t> tag.
############
tempXmlStr = etree.tostring(tempXmlXml, pretty_print=True) # Convert the changed XML into a string
with open("C:/temp.xml", "w+") as tempXmlFile:
tempXmlFile.write(tempXmlStr) #Write the changed file
for file in templateDocx.filelist:
if not file.filename == "word/document.xml":
newDocx.writestr(file.filename, templateDocx.read(file)) #write all files except the changed ones in the zipArchive
newDocx.write("C:/temp.xml", "word/document.xml") #write the document.xml file
templateDocx.close() #Close both template And new Docx
newDocx.close() # Close
以下是我创建的示例文档:
这是document.xml的相应代码:
<w:p w:rsidR="006C517B" w:rsidRDefault="00761A87">
<w:bookmarkStart w:id="0" w:name="_GoBack" />
<w:bookmarkEnd w:id="0" />
<w:r>
<w:t>First Line</w:t>
</w:r>
</w:p>
<w:p w:rsidR="00761A87" w:rsidRDefault="00761A87" />
<w:p w:rsidR="00761A87" w:rsidRDefault="00761A87">
<w:proofErr w:type="spellStart" />
<w:r>
<w:t>Third</w:t>
</w:r>
<w:proofErr w:type="spellEnd" />
<w:r>
<w:t xml:space="preserve"> Line</w:t>
</w:r>
</w:p>
<w:p w:rsidR="00761A87" w:rsidRDefault="00761A87" />
<w:p w:rsidR="00761A87" w:rsidRDefault="00761A87" />
<w:p w:rsidR="00761A87" w:rsidRDefault="00761A87">
<w:r>
<w:t>Six Line</w:t>
</w:r>
</w:p>
<w:p w:rsidR="00761A87" w:rsidRDefault="00761A87" />
<w:p w:rsidR="00761A87" w:rsidRDefault="00761A87" />
<w:p w:rsidR="00761A87" w:rsidRDefault="00761A87" />
<w:p w:rsidR="00761A87" w:rsidRDefault="00761A87">
<w:proofErr w:type="spellStart" />
<w:r>
<w:t>Ten</w:t>
</w:r>
<w:proofErr w:type="spellEnd" />
<w:r>
<w:t xml:space="preserve"> Line</w:t>
</w:r>
</w:p>
<w:p w:rsidR="00761A87" w:rsidRDefault="00761A87">
<w:proofErr w:type="spellStart" />
<w:r>
<w:t>Eleven</w:t>
</w:r>
<w:proofErr w:type="spellEnd" />
<w:r>
<w:t xml:space="preserve"> Line</w:t>
</w:r>
</w:p>
如您所见,新行是空的<w:p>
,如下所示:
<w:p w:rsidR="00761A87" w:rsidRDefault="00761A87" />
要删除多个新行,请检查它们是否为多个空<w:p>
,并删除除第一个之外的所有行。
希望有所帮助!
答案 1 :(得分:-2)
来自here:
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()
说明:
步骤1)准备要作为键替换的文本字符串的Python字典和作为项目的新文本(例如{&#34; XXXCLIENTNAMEXXX&#34;:&#34; Joe Bob&#34;,& #34; XXXMEETDATEXXX&#34;:&#34; 2013年5月31日&#34;})。
步骤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文档,享受被替换的文本!