使用python處理題庫(kù)表格并轉(zhuǎn)化為word形式的實(shí)現(xiàn)
前言
親人工作考試,公司給的題庫(kù)好像是直接從數(shù)據(jù)庫(kù)導(dǎo)出的表格Excel形式,在移動(dòng)端上非常難看,需要不斷左右上下滑動(dòng),看不了多少題眼就瞎了,遂主動(dòng)請(qǐng)纓編寫(xiě)python腳本解決之。
原本給的題庫(kù)在手機(jī)上橫屏顯示是這樣的↓↓↓(想象一下是在手機(jī)上)無(wú)比惡心
我的工作
公司給出的格式是.xlsx的(Excel表格的默認(rèn)格式),盲猜是直接從答題數(shù)據(jù)庫(kù)導(dǎo)出的,表名和屬性名應(yīng)該是稍微做了從英文到中文的改變,然后,就直接這樣發(fā)給員工了…
表格有八個(gè),放在一個(gè)文件夾下,由于不同工種的題表頭是相同的,因此可以編寫(xiě)代碼統(tǒng)一處理。
首先是獲取題庫(kù)存放路徑,便于對(duì)指定路徑文件處理:
to_path = r'D:\python_project\TableAfterProcessing' dir_path = r'D:\python_project\題庫(kù)名\backup' name_list = [] for i in os.listdir(dir_path): name_list.append(i)
之前學(xué)過(guò)python庫(kù)pandas的基本操作,由于一個(gè)月前數(shù)模美賽的時(shí)候使用過(guò)并使用博客記錄,因此總體來(lái)說(shuō)還不算生疏。
關(guān)于Excel表格的讀取,作者首先手動(dòng)將表格轉(zhuǎn)換成了.csv格式(表格不多,因此沒(méi)必要編寫(xiě)代碼了,當(dāng)然,如果愿意還是可以的)。
觀察到表格中知識(shí)點(diǎn)一欄數(shù)據(jù)完全相同,選項(xiàng)個(gè)數(shù)一欄并沒(méi)有什么參考價(jià)值,因此去掉這兩行,只保留題型,題干,選項(xiàng),答案。
然后就是采用pandas將缺失值null變?yōu)榭兆址? ',這樣的目的是避免將null這個(gè)字符寫(xiě)入到word。
for file_name in name_list: # 文件讀取路徑 from_path = os.path.join(dir_path, file_name) p_data = pd.read_csv(from_path, engine='python', usecols=['題型', '題干', '選項(xiàng)', '答案']) p_data = p_data.where(p_data.notnull(), '')
經(jīng)過(guò)對(duì)數(shù)據(jù)的處理后預(yù)處理后,表格便只剩下了四列數(shù)據(jù),清爽了很多。
然而光是這樣還是不夠的,畢竟涉及到手機(jī)端瀏覽表格就得放大,滑動(dòng),一不小心點(diǎn)到格子里去還要點(diǎn)出來(lái),對(duì)用戶很不友好。
因此,我決定將表格數(shù)據(jù)導(dǎo)入到word,變成常見(jiàn)的題型格式。
這就需要用到python的docx庫(kù),關(guān)于這個(gè)庫(kù)的講解就不在這里贅述了,筆者也是通過(guò)百度新學(xué)習(xí)的,這里主要說(shuō)一下設(shè)計(jì)和邏輯。
1.題型歸類(lèi)
題型分為單選題,多選題,判斷題。表格中對(duì)于每一個(gè)題都有其對(duì)應(yīng)的類(lèi)型描述,無(wú)外這三種。同時(shí),同一類(lèi)的數(shù)據(jù)是聚集在一起的,因此,可以設(shè)置標(biāo)志位記錄前一個(gè)題目所屬的題型,如果當(dāng)前類(lèi)別和上一個(gè)相同,則只需要寫(xiě)入題號(hào)題干等;如果不同,就使用docx中的Document.add_heading()
方法新建立一個(gè)標(biāo)題。
2.正確答案標(biāo)紅
如果單純的將答案寫(xiě)在每一個(gè)題的后面或者開(kāi)頭,這樣固然可以,但顯然不夠直觀。一種友好的方式是將正確答案標(biāo)為紅色,這樣便能直觀的看出。
如何實(shí)現(xiàn)呢?
原本表格中的答案是以'ABC'這樣的方式給出的,python中自帶關(guān)鍵字in
可以用來(lái)判斷A串是否連續(xù)存在于B中,例如'as' in 'asda'
,返回值是True
,而'sa' in 'asda'
返回值則是False
。
故而拿到了選項(xiàng)后,只需要使用str.split()
方法切分字符串,再依次判斷每個(gè)字符串的首個(gè)字符是否存在于正確答案字符串中就可以了。
拿這組數(shù)據(jù)舉例:
給定選項(xiàng)有:A.勞動(dòng)生產(chǎn)率 B.產(chǎn)品質(zhì)量 C.產(chǎn)量 D.工作質(zhì)量
因此切分后的字符串列表是這樣的['A.勞動(dòng)生產(chǎn)率', 'B.產(chǎn)品質(zhì)量', 'C.產(chǎn)量',' D.工作質(zhì)量']
正確答案字符串為'A,B,D'
取其中第一個(gè)字符串'A.勞動(dòng)生產(chǎn)率'
,首個(gè)字符為'A'
,A存在于'A,B,D'中,證明這條答案是正確的,因此調(diào)用docx庫(kù)自帶的方法將字符串寫(xiě)入到word并標(biāo)記為紅色。
# 若為判斷題則將答案寫(xiě)入 if q_type == '判斷題': document.add_paragraph(u'答案:' + str(r_ans) + '\n') # 否則只標(biāo)紅正確選項(xiàng) else: res_list = (str(r_choose)).split() # print(res_list) p.add_run('\n') for res in res_list: run = p.add_run(str(res) + ' ') # print(res[0]) if res[0] in r_ans: run.font.color.rgb = RGBColor(255,0,0) p.add_run('\n')
經(jīng)過(guò)我一通操作后變成了這樣↓↓↓
單選題
多選題
判斷題
代碼
這里放上整個(gè)代碼,若有需要的同學(xué)可以作為參考。
# *-* encoding:utf-8 *-* import os import pandas as pd from docx import Document from docx.oxml.ns import qn from docx.shared import RGBColor to_path = r'D:\python_project\TableAfterProcessing' dir_path = r'D:\python_project\XXXX\backup' name_list = [] for i in os.listdir(dir_path): name_list.append(i) print(name_list) # ['D:\\python_project\\XXX考試題庫(kù)\\backup\\ssss.csv'] for file_name in name_list: # 文件讀取路徑 from_path = os.path.join(dir_path, file_name) # 創(chuàng)建文檔對(duì)象,設(shè)置字體 document = Document() document.styles['Normal'].font.name = u'宋體' document.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋體') print((file_name)) p_data = pd.read_csv(from_path, engine='python', usecols=['題型', '題干', '選項(xiàng)', '答案']) p_data = p_data.where(p_data.notnull(), '') # 讀取指定幾列 q_type = '' for index in range(len(p_data)): r_type = p_data['題型'][index] r_cont = p_data['題干'][index] r_choose = p_data['選項(xiàng)'][index] r_ans = p_data['答案'][index] # print(str(r_choose)) # 判斷當(dāng)前題型,確定是否創(chuàng)建對(duì)應(yīng)類(lèi)別標(biāo)題 if r_type is not q_type: q_type = r_type document.add_heading(q_type) # 將題號(hào)以及題干寫(xiě)入文檔 p = document.add_paragraph(str(index+1) + r'.' + str(r_cont)) # 寫(xiě)入選項(xiàng) # if str(r_choose).strip() is not '': # document.add_paragraph(str(r_choose)) # 若為判斷題則將答案寫(xiě)入 if q_type == '判斷題': document.add_paragraph(u'答案:' + str(r_ans) + '\n') # 否則只標(biāo)紅正確選項(xiàng) else: res_list = (str(r_choose)).split() # print(res_list) p.add_run('\n') for res in res_list: run = p.add_run(str(res) + ' ') # print(res[0]) if res[0] in r_ans: run.font.color.rgb = RGBColor(255,0,0) p.add_run('\n') # p.add_run('') # 切分答案字符串 # pass # 寫(xiě)入對(duì)應(yīng)路徑 document.save(os.path.join(to_path, file_name[0:-4]+'.docx'))
到此這篇關(guān)于使用python處理題庫(kù)表格并轉(zhuǎn)化為word形式的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)python表格轉(zhuǎn)化為word內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python庫(kù)urllib與urllib2主要區(qū)別分析
這篇文章主要介紹了Python庫(kù)urllib與urllib2主要區(qū)別,需要的朋友可以參考下2014-07-07接口自動(dòng)化多層嵌套json數(shù)據(jù)處理代碼實(shí)例
這篇文章主要介紹了接口自動(dòng)化多層嵌套json數(shù)據(jù)處理代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11使用Python Tkinter創(chuàng)建文件生成工具的操作步驟
我們將使用Python的Tkinter模塊創(chuàng)建一個(gè)簡(jiǎn)單的文件生成工具,這個(gè)工具可以用來(lái)創(chuàng)建Excel、文本、Python腳本和Word文檔等不同類(lèi)型的文件,感興趣的朋友可以參考下2024-04-04python?PyAutoGUI實(shí)現(xiàn)自動(dòng)化鼠標(biāo)鍵盤(pán)等常用操作
這篇文章主要介紹了python?PyAutoGUI實(shí)現(xiàn)自動(dòng)化鼠標(biāo)鍵盤(pán)等常用操作使用實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12對(duì)Python3之進(jìn)程池與回調(diào)函數(shù)的實(shí)例詳解
今天小編就為大家分享一篇對(duì)Python3之進(jìn)程池與回調(diào)函數(shù)的實(shí)例詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01Python+OpenCV實(shí)現(xiàn)鼠標(biāo)畫(huà)瞄準(zhǔn)星的方法詳解
所謂瞄準(zhǔn)星指的是一個(gè)圓圈加一個(gè)圓圈內(nèi)的十字線,就像玩射擊游戲狙擊槍開(kāi)鏡的樣子一樣。本文將利用Python+OpenCV實(shí)現(xiàn)鼠標(biāo)畫(huà)瞄準(zhǔn)星,感興趣的可以嘗試一下2022-08-08