word文件(選擇題)轉換為excl表格
Word轉excl表格
同事在做一個批量性的工作,就是將word文件中的題目和選項,轉移到xml文件中。
例項:
轉:
再網上有很多將各種文件轉化的工具和例子,但是很少有將固定格式進行轉化的。
因為在這之前也是不明所以,老大直接讓寫個指令碼,本能的感覺這個指令碼不是很好寫,有危險。但是哪有害怕就不做的道理,不會也要幹。
首先確定好轉化思路
1、查了很多資料,轉excl的都是用的json檔案轉字典再轉excl或者將字典、元組、列表轉為json再轉excl。歸根結底就是將字典轉excl。比較欣喜的是正好可以將題目當做key,選項和答案當做values。這樣非常符合轉換過程。
2、那麼接下來的問題變成了如何將word文件內容轉換為字典的形式。其實也一樣很簡單,接下來一點一點的分析就OK了。
環境問題:
python3:在編寫過程中,因為出現中文,會遇到編碼問題,而python3又將編碼優化的很好,所以選擇python3。(如果你出現亂碼,或編碼不正確,請考慮編碼轉化對錯問題)
作業系統:linux(deepin)
困難又簡單的編寫歷程
1、將word文件轉換為字典形式
(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 迴圈當中。(百度得到,說白了就是給每行起個行號)
2、將字典轉化為excl檔案
(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的檔名
3、執行命令得到想要的excl表格
python3 docxToexcl.py
4、整個指令碼程式碼
#!/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表格。最大的問題就是如果文件中出現來一個空行,指令碼依然會計算進去,同時每六行迴圈依次的話,結果就會出來差別。指令碼需要改進,如今感覺好一點的辦法是利用正則匹配選項。等有機會寫出來的話再貼上來吧!!!