同事在做一个批量性的工作,就是将word文档中的题目和选项,转移到xml文档中。
实例:
转:
再网上有很多将各种文档转化的工具和例子,但是很少有将固定格式进行转化的。
因为在这之前也是不明所以,老大直接让写个脚本,本能的感觉这个脚本不是很好写,有危险。但是哪有害怕就不做的道理,不会也要干。
首先确定好转化思路
1、查了很多资料,转excl的都是用的json文件转字典再转excl或者将字典、元组、列表转为json再转excl。归根结底就是将字典转excl。比较欣喜的是正好可以将题目当做key,选项和答案当做values。这样非常符合转换过程。
2、那么接下来的问题变成了如何将word文档内容转换为字典的形式。其实也一样很简单,接下来一点一点的分析就OK了。
环境问题:
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表格。大的问题就是如果文档中出现来一个空行,脚本依然会计算进去,同时每六行循环依次的话,结果就会出来差别。脚本需要改进,如今感觉好一点的办法是利用正则匹配选项。等有机会写出来的话再贴上来吧!!!
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。