「AI投研邦」团体会员上线!75折解锁会员权益、PDF版研报、AI峰会....
06-18
背景:我每天都写计划,每天都写计划,写怀疑人生……所以我们可以用python来帮助我们实现那些重复性很高的计划。由于环境不支持连接外网,所以没有第三方包。
那些都好用的文字处理包都不能用了,难度一下子就上来了……至少有python3(对于py2来说,难度就更高了。) 注:由于代码都是在内网上写的,所以完整的无法提供版本。
例子。本文主要关注XML处理word/xlsx的一些陷阱。
分析:docx是doc的扩展,xlsx是xls的扩展。它们都是标准格式,似乎与其他制造商竞争兼容性。
本质上,它是一个 zip 文件。我们来一一看看DOCX。
我们先来看word,它是一个docx格式的文件。格式是指以下结构。
如果我们使用zip解压docx文件,我们可以看到以下信息。 docProps/app.xml 是一些应用程序信息,例如Manufacturer docProps/core.xml 是文件的一些基本信息,例如谁修改的、何时修改的。
因此,在传输word文件时应注意隐私和安全。 docProps/custom.xml是一些自定义信息,例如KEYword/media。
媒体资源,比如图片,word/theme是一些主题,word/document.xml是我们的文档。这是本文的重点。
代码语言:md copy├── [Content_Types].xml├── docProps│ ├── app. xml│? ├── core.xml│? └── custom.xml├── _rels└── word ├── document.xml ├── fontTable.xml ├── media │? ├── image1.png │? ├── image2.png │ ├── image3.png │ ├── image4.png │ ├── image5.png │ ├── image6.png │ ├── image7.png │ └── image8.png ├── _rels │ └── document.xml.rels ├── settings.xml ├── styles.xml└── theme └── theme1.xmldocument.xml 文件解析并读取数据。我们使用浏览器打开xml文件(直接将xml文件拖到浏览器中即可)。
您将看到类似于以下的格式。这是一个 xml 文件。
我们可以使用python的xml.dom.minidom来解析这个文件。由于是zip文件,所以必须先使用zipfile解压文件并读取里面的document.xml文件。
代码语言:python 代码运行次数:0 复制Cloud Studio代码并运行 import zipfileimport os ,sysfrom xml.dom import minidomfilename = "aaaa.docx" #我们的word文件 #namespace namespace = {"w":" zipfile.ZipFile( filename,'r') as docx: with docx.open('word/ document.xml', 'r') as docx_xml: xml_content = docx_xml.read() root = minidom.parseString(xml_content).documentElement body = root. childNodes[0]w:body 是我们文档的主体部分 w:p 是段落 w:tbl 是表格 w:t 是记录文本。所有数据,我们可以直接使用 getElementsByTagName('w:t') 来编码: Number of python code running: 0 复制 Cloud Studio 代码并运行 for ) #w:t 不是具体数据,实际上有一个节点它调用#textdocument.xml文件解析并写入数据读取数据很简单,直接遍历w:t即可,但是写入数据比较麻烦。
尤其是新的数据,看着那一对复杂的格式,让人头疼。 1.幸运的是,我们可以使用cloneNode来克隆节点。
(elementree 不用了,巨大的坑啊,不剧透了。)这样我们就可以遍历w:t的匹配值了。
如果存在匹配,则返回 w:t 中最接近的 w:p(段落)。只是w:t不方便。
,通常建议直接复制一段。否则格式会太复杂。
如果是表格,则只需行即可。 2.然后使用insertBefore在指定位置插入。
3. 不需要的数据可以使用removeChild删除。 4、修改 数据完成后,就可以写回word文件了。
我们重新打开word,看看是否是文档。代码语言:python 代码运行次数:0 Copy Cloud Studio code run #首先找到一个节点。
我刚刚在这里找到了 ref_node = body.getElementsByTagName('w:t')[12].parentNode.parentNode# 克隆节点并修改数据 new_node = ref_node.cloneNode(1) new_node.firstChild.firstChild.firstChild.nodeValue = "使用minidom修改的数据" # 插入到指定位置 ref_node.parentNode.insertBefore(new_node, ref_node) #删除(这里就不演示了) (removeChild(ref_node) 'newfile.docx','w') as zout:for item在 zin.infolist() 中:if item.filename == "word/document.xml": #如果是文档就用我们修改的 zout.writestr(item,root.toxml().encode())else:zout.writestr(item, zin.read (item.filename))document.xml文件解析验证,可以自行验证。 XLS的内容要做(坑的开始。
)我们还是用zip解压查看代码语言:md copy ├── [Content_Types].xml├── docProps│ ├── app.xml│ ├── core.xml│ └── 自定义 .xml├── _rels└── .xml └── 工作表 ├──sheet1.xml ├──sheet2.xml └──sheet3.xmldocProps 与单词 one 类似。我们主要看xl目录。
xl/sharedStrings.xml是共享字符,我们实际的数据是 xl/worksheets/sheet1.xml 这里的xl/worksheets/sheet1.xml就是我们的sheetxl/workbook.xml的sharedStrings.xml,记录了sheet等信息。这个xml文件非常简单。
它是一个字符串列表。这个文件主要记录那些共享的值,所以这里的值应该尽可能唯一。
索引是表中记录的值,所以这个位置也很重要。基本上就是遍历,索引在shardStrings中返回。
否则,将被插入并返回 len()-1。我就不写 example.xl /worksheets/sheet1.xml 其实这个文件格式比较简单。
数据放置在sheetData中。表面。
sheetData与tablerow类似,即c行是col列。 v是value(是字符串,即使看到数字也是字符串(小坑))。
row 中的跨度是记录该行中数据的列数。 r 是行号(从1开始)。
c中的r是记录列号,是excel中的A1 A2 t记录数据类型。例如,t='s'表示数据是共享的,所以你必须去sharedStrings.xml中找到它。
xl/worksheets/sheet1.xml读写:比较简单,直接遍历即可。也可以使用索引来访问。
例如, xml.etree.elementtree()[5][ROWNO][COLNO].text 是 ROWNO 行 COLNO 列的值。如果要修改,必须先deepcopy出来,然后再修改,全部修改完成后再copy回去。
不然数据会乱。这是一个巨大的陷阱。
写回 xlsx 文件与 word 相同。它只是多个文件(sharedStrings.xml)。
所以我这里就不演示了。总结1.虽然python自带的xml可以操作docx和xlsx文档,但是不推荐,因为太蛋疼了。
2、实际写代码的时候,要根据自己的情况来。抽象多个方法使编写更容易。
例如,(复制某一行,然后修改指定列的数据,最后在行尾插入这一系列操作)到一个方法中。同样的操作也非常简单。
也就是每一种循环...) 3.注意环境,docx可能有命名空间问题。 4、如果xlsx数据部分不显示,很大概率是c的行号或者列号有问题。
更糟糕的是,没有进行 DeepCopy,而是直接遍历并修改原始值。
版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。如果发现本站有涉嫌抄袭的内容,欢迎发送邮件 举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。
标签:
相关文章
06-06
06-18
06-17
06-18
06-21
06-21
06-06
最新文章
【玩转GPU】ControlNet初学者生存指南
【实战】获取小程序中用户的城市信息(附源码)
包雪雪简单介绍Vue.js:开学
Go进阶:使用Gin框架简单实现服务端渲染
线程池介绍及实际案例分享
JMeter 注释 18 - JMeter 常用配置组件介绍
基于Sentry的大数据权限解决方案
【云+社区年度征文集】GPE监控介绍及使用