同事在作一個批量性的工做,就是將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表格。最大的問題就是若是文檔中出現來一個空行,腳本依然會計算進去,同時每六行循環依次的話,結果就會出來差異。腳本須要改進,現在感受好一點的辦法是利用正則匹配選項。等有機會寫出來的話再貼上來吧!!!