使用python處理題庫(kù)表格并轉(zhuǎn)化為word形式的實(shí)現(xiàn)
前言
親人工作考試,公司給的題庫(kù)好像是直接從數(shù)據(jù)庫(kù)導(dǎo)出的表格Excel形式,在移動(dòng)端上非常難看,需要不斷左右上下滑動(dòng),看不了多少題眼就瞎了,遂主動(dòng)請(qǐng)纓編寫python腳本解決之。
原本給的題庫(kù)在手機(jī)上橫屏顯示是這樣的↓↓↓(想象一下是在手機(jī)上)無比惡心

我的工作
公司給出的格式是.xlsx的(Excel表格的默認(rèn)格式),盲猜是直接從答題數(shù)據(jù)庫(kù)導(dǎo)出的,表名和屬性名應(yīng)該是稍微做了從英文到中文的改變,然后,就直接這樣發(fā)給員工了…
表格有八個(gè),放在一個(gè)文件夾下,由于不同工種的題表頭是相同的,因此可以編寫代碼統(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é)過python庫(kù)pandas的基本操作,由于一個(gè)月前數(shù)模美賽的時(shí)候使用過并使用博客記錄,因此總體來說還不算生疏。
關(guān)于Excel表格的讀取,作者首先手動(dòng)將表格轉(zhuǎn)換成了.csv格式(表格不多,因此沒必要編寫代碼了,當(dāng)然,如果愿意還是可以的)。
觀察到表格中知識(shí)點(diǎn)一欄數(shù)據(jù)完全相同,選項(xiàng)個(gè)數(shù)一欄并沒有什么參考價(jià)值,因此去掉這兩行,只保留題型,題干,選項(xiàng),答案。
然后就是采用pandas將缺失值null變?yōu)榭兆址? ',這樣的目的是避免將null這個(gè)字符寫入到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)過對(duì)數(shù)據(jù)的處理后預(yù)處理后,表格便只剩下了四列數(shù)據(jù),清爽了很多。
然而光是這樣還是不夠的,畢竟涉及到手機(jī)端瀏覽表格就得放大,滑動(dòng),一不小心點(diǎn)到格子里去還要點(diǎn)出來,對(duì)用戶很不友好。
因此,我決定將表格數(shù)據(jù)導(dǎo)入到word,變成常見的題型格式。
這就需要用到python的docx庫(kù),關(guān)于這個(gè)庫(kù)的講解就不在這里贅述了,筆者也是通過百度新學(xué)習(xí)的,這里主要說一下設(shè)計(jì)和邏輯。
1.題型歸類
題型分為單選題,多選題,判斷題。表格中對(duì)于每一個(gè)題都有其對(duì)應(yīng)的類型描述,無外這三種。同時(shí),同一類的數(shù)據(jù)是聚集在一起的,因此,可以設(shè)置標(biāo)志位記錄前一個(gè)題目所屬的題型,如果當(dāng)前類別和上一個(gè)相同,則只需要寫入題號(hào)題干等;如果不同,就使用docx中的Document.add_heading()方法新建立一個(gè)標(biāo)題。
2.正確答案標(biāo)紅
如果單純的將答案寫在每一個(gè)題的后面或者開頭,這樣固然可以,但顯然不夠直觀。一種友好的方式是將正確答案標(biāo)為紅色,這樣便能直觀的看出。
如何實(shí)現(xiàn)呢?
原本表格中的答案是以'ABC'這樣的方式給出的,python中自帶關(guān)鍵字in可以用來判斷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ù)自帶的方法將字符串寫入到word并標(biāo)記為紅色。
# 若為判斷題則將答案寫入
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)過我一通操作后變成了這樣↓↓↓
單選題

多選題

判斷題

代碼
這里放上整個(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)類別標(biāo)題
if r_type is not q_type:
q_type = r_type
document.add_heading(q_type)
# 將題號(hào)以及題干寫入文檔
p = document.add_paragraph(str(index+1) + r'.' + str(r_cont))
# 寫入選項(xiàng)
# if str(r_choose).strip() is not '':
# document.add_paragraph(str(r_choose))
# 若為判斷題則將答案寫入
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
# 寫入對(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)文章
pycharm配置anaconda環(huán)境時(shí)找不到python.exe解決辦法
今天來說一下python中一個(gè)管理包很好用的工具anaconda,可以輕松實(shí)現(xiàn)python中各種包的管理,這篇文章主要給大家介紹了關(guān)于pycharm配置anaconda環(huán)境時(shí)找不到python.exe的解決辦法,需要的朋友可以參考下2023-10-10
python實(shí)現(xiàn)由數(shù)組生成對(duì)稱矩陣
本文給大家分享的是由數(shù)組生成對(duì)稱矩陣的思路并附上了使用Python實(shí)現(xiàn)的代碼,希望大家能夠喜歡2021-05-05
Python文件讀取read()?readline()?readlines()函數(shù)使用場(chǎng)景技巧示例
這篇文章主要介紹了Python文件讀取read() readline()及readlines()函數(shù)使用場(chǎng)景技巧示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08
python BlockingScheduler定時(shí)任務(wù)及其他方式的實(shí)現(xiàn)
這篇文章主要介紹了python BlockingScheduler定時(shí)任務(wù)及其他方式的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
Python復(fù)制Excel表格中指定數(shù)據(jù)若干次的方法
本文介紹基于Python語言,讀取Excel表格文件數(shù)據(jù),并基于其中某一列數(shù)據(jù)的值,將這一數(shù)據(jù)處于指定范圍的那一行加以復(fù)制,并將所得結(jié)果保存為新的Excel表格文件的方法,需要的朋友可以參考下2024-02-02
Python編寫Windows Service服務(wù)程序
這篇文章主要為大家詳細(xì)介紹了Python編寫Windows Service服務(wù)程序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01
詳解從Django Allauth中進(jìn)行登錄改造小結(jié)
這篇文章主要介紹了從 Django Allauth 中進(jìn)行登錄改造小結(jié),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12

