Python Word文档处理 上篇:python-docx

Python Word文档处理 上篇:python-docx,第1张

某天我收到一个需求:希望能够用python对word文档进行一些处理,比如更换一些文字以及添加批注。

简单搜索后,我发现 python-docx 是一个处理docx文档的常用python库,因此我打算用它来进行进一步开发。

官方文档 提供了一个简单的示例

python-docx 将文档抽象为document对象、paragraph对象以及run对象,提供了围绕这些对象进行简单处理的API

然而在文档中并没有出现关于批注 *** 作的部分,我在搜寻 一些文章 后发现了在某个 issue 中提及了添加批注相关信息,然而还是没有得到具体的解决办法

docx文档底层是由XML文件组成的

我们可以将一个 xxdocx 文件的后缀名改为 rar 然后将其手动解压,可以得到下面这些文件

在诸多文件当中主要用到的是 documentxml 文件,这里保存了文档的内容

打开一份 documentxml 文件,抛开header、footer、table以及其他特殊项,去掉样式等修饰项,一份朴素的docx文档主要可以分为三个部分:paragraph、run、text

paragraph即段落,就是我们在word当中看到的一段。text即文本,就是真实的内容。run比较抽象,我们可以将其理解为片段,即语句的切分。

为了更好地理解run是什么,打开一篇word文档定位其中一句话

让我们看看这篇文档解压之后的 documentxml 文件中对应的部分

OK,我们可以看到原本完整的一句话在word中被拆分成了许多个 <w:r> 标签,这就是 run ,word切分 run 的规则很多,有的根据标点符号,有的根据中文分词,句子中如果存在不同样式的字词也会单独切分出来,因此我们很难预估一句话究竟会被分成几个片段。

在issue中搜索comment关键字发现在一个 merge request 上已经给出了添加批注的解决方案,可以通过 paragraph 对象上的 add_comment 方法给一个段落添加批注

但这还是不符合我的需求,我的目标是精准添加到某个词或者短语上

打开 这个贡献者的源码 进行研究

其实就是在P标签内插入comment标签引用,同时添加comment标签到xx文件

同理我们可以在r标签内插入comment标签引用,同时添加comment标签到xx文件,这样就能实现给特定词添加批注的需求了

最近由于经常要用到Excel,需要根据Excel表格中的内容对一些apk进行处理,手动处理很麻烦,于是决定写脚本来处理。首先贴出网上找来的读写Excel的脚本。

1读取Excel(需要安装xlrd):

123456789101112131415161718192021222324#-- coding: utf8 --import xlrd  fname = "reflectxls"bk = xlrdopen_workbook(fname)shxrange = range(bknsheets)try: sh = bksheet_by_name("Sheet1")except: print "no sheet in %s named Sheet1" % fname#获取行数nrows = shnrows#获取列数ncols = shncolsprint "nrows %d, ncols %d" % (nrows,ncols)#获取第一行第一列数据cell_value = shcell_value(1,1)#print cell_value  row_list = []#获取各行数据for i in range(1,nrows): row_data = shrow_values(i) row_listappend(row_data)

2写入Excel(需安装pyExcelerator)

12345678from pyExcelerator import  w = Workbook()  #创建一个工作簿ws = wadd_sheet('Hey, Hades')  #创建一个工作表wswrite(0,0,'bit') #在1行1列写入bitwswrite(0,1,'huang') #在1行2列写入huangwswrite(1,0,'xuan') #在2行1列写入xuanwsave('minixls')  #保存

3再举个自己写的读写Excel的例子

读取reflectxls中的某些信息进行处理后写入minixls文件中。 

1234567891011121314151617181920212223242526272829303132333435363738394041424344#-- coding: utf8 --import xlrdfrom pyExcelerator import   w = Workbook()ws = wadd_sheet('Sheet1') fname = "reflectxls"bk = xlrdopen_workbook(fname)shxrange = range(bknsheets)try: sh = bksheet_by_name("Sheet1")except: print "no sheet in %s named Sheet1" % fname nrows = shnrowsncols = shncolsprint "nrows %d, ncols %d" % (nrows,ncols)  cell_value = shcell_value(1,1)#print cell_value  row_list = []mydata = []for i in range(1,nrows): row_data = shrow_values(i) pkgdatas = row_data[3]split(',') #pkgdatassplit(',') #获取每个包的前两个字段 for pkgdata in pkgdatas:  pkgdata = ''join((pkgdatasplit(''))[:2])  mydataappend(pkgdata) #将列表排序 mydata = list(set(mydata)) print mydata #将列表转化为字符串 mydata = ','join(mydata) #写入数据到每行的第一列 wswrite(i,0,mydata) mydata = [] row_listappend(row_data[3])#print row_list wsave('minixls')

4现在我需要根据Excel文件中满足特定要求的apk的md5值来从服务器获取相应的apk样本,就需要这样做: 

123456789101112131415161718192021222324252627282930313233#--coding:utf8--import xlrdimport osimport shutil  fname = "/excelnamexls"bk = xlrdopen_workbook(fname)shxrange = range(bknsheets)try: #打开Sheet1工作表 sh = bksheet_by_name("Sheet1")except: print "no sheet in %s named Sheet1" % fname#获取行数nrows = shnrows#获取列数ncols = shncols#print "nrows %d, ncols %d" % (nrows,ncols)#获取第一行第一列数据cell_value = shcell_value(1,1)#print cell_value  row_list = []#range(起始行,结束行)for i in range(1,nrows): row_data = shrow_values(i) if row_data[6] == "HXB":  filename = row_data[3]+"apk"  #print "%s %s %s" %(i,row_data[3],filename)  filepath = r"/1/"+filename  print "%s %s %s" %(i,row_data[3],filepath)  if ospathexists(filepath):   shutilcopy(filepath, r"/myapk/")

补充一个使用xlwt3进行Excel文件的写 *** 作。

1234567891011121314151617181920212223242526import xlwt3 if __name__ == '__main__':         datas = [['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h']]#二维数组    file_path = 'D:\\testxlsx'         wb = xlwt3Workbook()    sheet = wbadd_sheet('test')#sheet的名称为test         #单元格的格式    style = 'pattern: pattern solid, fore_colour yellow; '#背景颜色为**    style += 'font: bold on; '#粗体字    style += 'align: horz centre, vert center; '#居中    header_style = xlwt3easyxf(style)         row_count = len(datas)    col_count = len(datas[0])    for row in range(0, row_count):        col_count = len(datas[row])        for col in range(0, col_count):            if row == 0:#设置表头单元格的格式                sheetwrite(row, col, datas[row][col], header_style)            else:                sheetwrite(row, col, datas[row][col])    wbsave(file_path)

输出的文件内容如下图:

注:以上代码在Python 3x版本测试通过。

好了,python *** 作Excel就这么!些了,简单吧

以下代码调试通过:

import xlrd

# 打开 xls 文件

book = xlrdopen_workbook("testxls")

print "表单数量:", booknsheets

print "表单名称:", booksheet_names()

# 获取第1个表单

sh = booksheet_by_index(0)

print u"表单 %s 共 %d 行 %d 列" % (shname, shnrows, shncols)

print "第二行第三列:", shcell_value(1, 2)

运行效果:

以上就是关于Python Word文档处理 上篇:python-docx全部的内容,包括:Python Word文档处理 上篇:python-docx、python怎么读取excel的数据、如何用python读取excel文件等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/10127878.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存