欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用python處理題庫(kù)表格并轉(zhuǎn)化為word形式的實(shí)現(xiàn)

 更新時(shí)間:2020年04月14日 17:20:36   作者:摩霄志在潛修羽  
這篇文章主要介紹了使用python處理題庫(kù)表格并轉(zhuǎn)化為word形式的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

親人工作考試,公司給的題庫(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)文章

最新評(píng)論