同事在作一个批量性的工做,就是将word文档中的题目和选项,转移到xml文档中。
实例:
转:python
再网上有不少将各类文档转化的工具和例子,可是不多有将固定格式进行转化的。linux
由于在这以前也是不明因此,老大直接让写个脚本,本能的感受这个脚本不是很好写,有危险。可是哪有惧怕就不作的道理,不会也要干。json
首先肯定好转化思路app
一、查了不少资料,转excl的都是用的json文件转字典再转excl或者将字典、元组、列表转为json再转excl。归根结底就是将字典转excl。比较欣喜的是正好能够将题目当作key,选项和答案当作values。这样很是符合转换过程。
二、那么接下来的问题变成了如何将word文档内容转换为字典的形式。其实也同样很简单,接下来一点一点的分析就OK了。ide
环境问题:
python3:在编写过程当中,由于出现中文,会遇到编码问题,而python3又将编码优化的很好,因此选择python3。(若是你出现乱码,或编码不正确,请考虑编码转化对错问题)
操做系统:linux(deepin)函数
困难又简单的编写历程工具
(1)读取word文档内容,python中给出了模块,python-docx
下载模块:测试
sudo pip3 install python-docx优化
咱们须要用到的这个模块方法很简单,只须要读取和输出就能够了编码
import docx file = docx.Document("./密码学竞赛习题.docx")
Document() 用来打开一个文档
(2)循环输出文档内容,将内容添加到字典当中
从word文档中我发现从第六行开始,没六行为一个题目加上答案。因此我想出先将每一个题目循环输出出来,而后在将每一个题目的内容循环加入的字典当中。又由于每一个键对用多个值,因此,我将选项建立一个列表。
a={} file = docx.Document("./密码学竞赛习题.docx") for l in range(1,61): b=[] for idx,para in enumerate(file.paragraphs[6*l:6+6*l]): if idx==0: key=para.text elif idx==1: v1=para.text b.append(v1) elif idx==2: v2=para.text b.append(v2) elif idx==3: v3=para.text b.append(v3) elif idx==4: v4=para.text b.append(v4) elif idx==5: v5=para.text b.append(v5) a.update({key:b})
enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,通常用在 for 循环当中。(百度获得,说白了就是给每行起个行号)
(1)首先建立excl文件
python也给出了处理表格的模块xlwt,能够直接去下载
sudo pip3 install xlwt
建立一个表格
book = xlwt.Workbook() #建立excl文件 sheet = book.add_sheet('sheet1') #建立一个表 title = ['题目','A','B','C','D','答案'] #每一列标题 for col in range(len(title)): #将标题逐个添加到表格当中 sheet.write(0,col,title[col]) row=1 #设置行号
(2)正儿八经转excl
一切准备就绪,接下来就是将字典中的内容逐个加入到建立的excl中就OK
for k in a: data=a[k] data.insert(0,k) #第一列加入序号 for index in range(len(data)): #依次写入每一行 sheet.write(row,index,data[index]) row += 1 book.save('TimuTest.xls') #保存excl的文件名
python3 docxToexcl.py
#!/usr/bin/python3 #coding:utf-8 import docx import re import json import xlwt a={} file = docx.Document("./密码学竞赛习题.docx") for l in range(1,61): b=[] for idx,para in enumerate(file.paragraphs[6*l:6+6*l]): if idx==0: key=para.text elif idx==1: v1=para.text b.append(v1) elif idx==2: v2=para.text b.append(v2) elif idx==3: v3=para.text b.append(v3) elif idx==4: v4=para.text b.append(v4) elif idx==5: v5=para.text b.append(v5) a.update({key:b}) book = xlwt.Workbook() sheet = book.add_sheet('sheet1') title = ['题目','A','B','C','D','答案'] for col in range(len(title)): sheet.write(0,col,title[col]) row=1 for k in a: data=a[k] data.insert(0,k) for index in range(len(data)): sheet.write(row,index,data[index]) row += 1 book.save('test.xls')
其实这个脚本写出来并不满意,由于我在写的时候,只考虑到了正在测试的word文档格式,既然是批量的,文档的格式也不必定都是同样的。因此很难作到将别的格式的文档转化为想要的excl表格。最大的问题就是若是文档中出现来一个空行,脚本依然会计算进去,同时每六行循环依次的话,结果就会出来差异。脚本须要改进,现在感受好一点的办法是利用正则匹配选项。等有机会写出来的话再贴上来吧!!!