如何基于Python實現(xiàn)word文檔重新排版
介紹
舍友從網(wǎng)上下載的word題庫文檔很亂,手動改了大半天才改了一點,想起python是大名鼎鼎的自動化腳本,于是乎開始了python對word的一頓瞎操作。
分析需求
對文檔中的內(nèi)容進行分析,只留下題目,選項,并且題號要從1開始。
編寫代碼
pip安裝python-docx模塊
讀取word文檔內(nèi)容(如果是以.doc后綴的文件需另存為.docx文件?。?/p>
from docx import Document # 打開文件 srcdocx = Document(‘src.docx‘) # 遍歷所有段落 for p in srcdocx.paragraphs: print(p.text)
輸出效果:
分析所需要刪除的內(nèi)容:
需求1:
1
42.對餐后血糖顯著升高的2型糖尿病者,可選用下列哪種藥物(5.0分)
刪除多余數(shù)字行
需求2:
42.對餐后血糖顯著升高的2型糖尿病者,可選用下列哪種藥物(5.0分)
修改正確的題目序號
需求3:
刪除“窗體底端”“窗體頂端”
需求4:
A、
阿卡波糖
選項合成一行
需求5:
刪除多余空白行
編寫代碼
本質(zhì)上來講,實現(xiàn)就是從源文檔中取出一段文字進行處理操作,然后保存到目標文檔。
其中,需求1,3,5的實現(xiàn),只需要判斷一下取出的內(nèi)容是否是需要刪除的內(nèi)容,如果是,則不用保存到目標文檔中,這樣就實現(xiàn)了“間接刪除”。
對于需求2的實現(xiàn),通過觀察我們不難發(fā)現(xiàn),序號后面總有一個". ",所以我們只需要獲取到這個的坐標,把前面的錯誤序號刪除,插入正確的序號到處理字符串,最后保存到新文檔,這樣就完成了“修正題目序號”。
需求4的實現(xiàn)類似需求2,只需要找到 “、” 符號就行,然后進行類似操作,就能實現(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 # 修正錯誤題目序號 # src,源字符串 nPos,序號結束下標 cnt,正確序號 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‘) # 目標文檔 outDocx = Document() idx = 0 # 遍歷下標 length = len(srcdocx.paragraphs) # 總段落數(shù) cnt = 1 # 遍歷序號 sum = 1 # 修改總次數(shù) while(1): if idx >= length: break src = srcdocx.paragraphs[idx].text # 實現(xiàn)需求1,3,5 if((src == "窗體底端") or (src =="窗體頂端") or (src == "") or (is_number(src))) : print(f"正在修改第{sum}處錯誤 {src}") sum = sum + 1 # 計算修改的次數(shù) idx = idx + 1 continue # 實現(xiàn)需求2 nPos1 = src.find(".") if nPos1 != -1 : # 查找到有序號的行 dest = changeNum(src,nPos1,cnt) print(f"正在修改第{sum}處錯誤 {src}") sum = sum + 1 # 計算修改的次數(shù) cnt = cnt + 1 # 序號后移 outDocx.add_paragraph(dest) # 寫入數(shù)據(jù)到新word # 實現(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}處錯誤 {src},{src2}") sum = sum + 1 # 計算修改的次數(shù) idx = idx + 1 outDocx.save(‘out.docx‘) print(f"修改完成!共計{sum}個錯誤!")
運行效果:
最終效果
總結
Python還是一個極為強大的工具,并且門檻低,易入門,以后我要多多學習Python!如果我的博客能給你點思路,那就發(fā)揮了很大的作用了!人生苦短,我用Python~
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
python一招完美搞定Chromedriver的自動更新問題
這篇文章主要介紹了python一招完美搞定Chromedriver的自動更新,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-09-09Python 如何實時向文件寫入數(shù)據(jù)(附代碼)
這篇文章主要介紹了Python 如何實時向文件寫入數(shù)據(jù)(附代碼),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07python中的break、continue、exit()、pass全面解析
下面小編就為大家?guī)硪黄猵ython中的break、continue、exit()、pass全面解析。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-08-08Python報錯no?module?named?torch的幾種原因及解決方案
這篇文章主要給大家介紹了關于Python報錯no?module?named?torch的幾種原因及解決方案,這是小白時常犯的錯,這個報錯一般說明在你電腦當前環(huán)境下沒有安裝torch這個模塊,但也有其他情況,需要的朋友可以參考下2023-10-10Python常見內(nèi)置高階函數(shù)即高階函數(shù)用法
這篇文章主要介紹了Python的三種高階函數(shù)map、filter、reduce,高階函數(shù)就是一個函數(shù)可以作為參數(shù)傳給另外一個函數(shù),或者一個函數(shù)的返回值為另外一個函數(shù)(若返回值為該函數(shù)本身,則為遞歸),滿足其一則為高階函數(shù),具體內(nèi)容,需要的朋友可以參考下面文章的介紹2021-12-12