如何基于Python實(shí)現(xiàn)word文檔重新排版
介紹
舍友從網(wǎng)上下載的word題庫(kù)文檔很亂,手動(dòng)改了大半天才改了一點(diǎn),想起python是大名鼎鼎的自動(dòng)化腳本,于是乎開(kāi)始了python對(duì)word的一頓瞎操作。

分析需求
對(duì)文檔中的內(nèi)容進(jìn)行分析,只留下題目,選項(xiàng),并且題號(hào)要從1開(kāi)始。
編寫(xiě)代碼
pip安裝python-docx模塊
讀取word文檔內(nèi)容(如果是以.doc后綴的文件需另存為.docx文件?。?/p>
from docx import Document # 打開(kāi)文件 srcdocx = Document(‘src.docx‘) # 遍歷所有段落 for p in srcdocx.paragraphs: print(p.text)
輸出效果:

分析所需要?jiǎng)h除的內(nèi)容:
需求1:
1
42.對(duì)餐后血糖顯著升高的2型糖尿病者,可選用下列哪種藥物(5.0分)
刪除多余數(shù)字行
需求2:
42.對(duì)餐后血糖顯著升高的2型糖尿病者,可選用下列哪種藥物(5.0分)
修改正確的題目序號(hào)
需求3:
刪除“窗體底端”“窗體頂端”
需求4:
A、
阿卡波糖
選項(xiàng)合成一行
需求5:
刪除多余空白行
編寫(xiě)代碼
本質(zhì)上來(lái)講,實(shí)現(xiàn)就是從源文檔中取出一段文字進(jìn)行處理操作,然后保存到目標(biāo)文檔。
其中,需求1,3,5的實(shí)現(xiàn),只需要判斷一下取出的內(nèi)容是否是需要?jiǎng)h除的內(nèi)容,如果是,則不用保存到目標(biāo)文檔中,這樣就實(shí)現(xiàn)了“間接刪除”。
對(duì)于需求2的實(shí)現(xiàn),通過(guò)觀察我們不難發(fā)現(xiàn),序號(hào)后面總有一個(gè)". ",所以我們只需要獲取到這個(gè)的坐標(biāo),把前面的錯(cuò)誤序號(hào)刪除,插入正確的序號(hào)到處理字符串,最后保存到新文檔,這樣就完成了“修正題目序號(hào)”。
需求4的實(shí)現(xiàn)類(lèi)似需求2,只需要找到 “、” 符號(hào)就行,然后進(jìn)行類(lèi)似操作,就能實(shí)現(xiàn) “合并兩行”。
from docx import Document
# 判斷字符串是否為數(shù)字
def is_number(s):
try:
float(s)
return True
except ValueError:
pass
try:
import unicodedata
unicodedata.numeric(s)
return True
except (TypeError, ValueError):
pass
return False
# 修正錯(cuò)誤題目序號(hào)
# src,源字符串 nPos,序號(hào)結(jié)束下標(biāo) cnt,正確序號(hào)
def changeNum(src,nPos,cnt):
s = src[:0] + src[nPos:]
str_list = list(s)
str_list.insert(0, str(cnt))
dest = ‘‘.join(str_list)
return dest
# 源文檔
srcdocx = Document(‘src.docx‘)
# 目標(biāo)文檔
outDocx = Document()
idx = 0 # 遍歷下標(biāo)
length = len(srcdocx.paragraphs) # 總段落數(shù)
cnt = 1 # 遍歷序號(hào)
sum = 1 # 修改總次數(shù)
while(1):
if idx >= length:
break
src = srcdocx.paragraphs[idx].text
# 實(shí)現(xiàn)需求1,3,5
if((src == "窗體底端") or (src =="窗體頂端") or (src == "") or (is_number(src))) :
print(f"正在修改第{sum}處錯(cuò)誤 {src}")
sum = sum + 1 # 計(jì)算修改的次數(shù)
idx = idx + 1
continue
# 實(shí)現(xiàn)需求2
nPos1 = src.find(".")
if nPos1 != -1 :
# 查找到有序號(hào)的行
dest = changeNum(src,nPos1,cnt)
print(f"正在修改第{sum}處錯(cuò)誤 {src}")
sum = sum + 1 # 計(jì)算修改的次數(shù)
cnt = cnt + 1 # 序號(hào)后移
outDocx.add_paragraph(dest) # 寫(xiě)入數(shù)據(jù)到新word
# 實(shí)現(xiàn)需求4
nPos2 = src.find(‘、‘)
if nPos2 != -1 :
src2 = srcdocx.paragraphs[idx+1].text
outDocx.add_paragraph(src+src2)
idx = idx + 1
print(f"正在修改第{sum}處錯(cuò)誤 {src},{src2}")
sum = sum + 1 # 計(jì)算修改的次數(shù)
idx = idx + 1
outDocx.save(‘out.docx‘)
print(f"修改完成!共計(jì){sum}個(gè)錯(cuò)誤!")
運(yùn)行效果:

最終效果

總結(jié)
Python還是一個(gè)極為強(qiáng)大的工具,并且門(mén)檻低,易入門(mén),以后我要多多學(xué)習(xí)Python!如果我的博客能給你點(diǎn)思路,那就發(fā)揮了很大的作用了!人生苦短,我用Python~
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
pandas刪除某行或某列數(shù)據(jù)的實(shí)現(xiàn)示例
本文主要介紹了pandas刪除某行或某列數(shù)據(jù)的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08
使用Python發(fā)送郵件附件以定時(shí)備份MySQL的教程
這篇文章主要介紹了使用Python發(fā)送郵件附件以定時(shí)備份MySQL的教程,本文的示例基于CentOS,需要的朋友可以參考下2015-04-04
基于Python編寫(xiě)一個(gè)單詞自測(cè)程序
這篇文章主要為大家詳細(xì)介紹了如何基于Python編寫(xiě)一個(gè)單詞自測(cè)程序,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-12-12

