【Python】如何用Python实现Word文档拆分
有時候,工作中可能會遇到以下場景:將一個含有幾十篇文章(約幾百至上千頁)的word文件拆分為多個文件,每個文件包含一篇文章。
幾百上千頁的文檔,手工處理實在低效,稍微打個盹兒還可能出錯。好在我們有python,僅需編寫幾行代碼就可借助python-docx模塊拆分word文件,實現自動化辦公。
1. 模塊安裝與概念介紹
python-docx是用于創建和更新Microsoft Word(.docx)文件的Python庫。如果你日常需要經常處理Word文檔,那么非常推薦使用python-docx,它處理起docx很方便。
python-docx模塊已經提交給PyPI倉庫,使用下述命令即可安裝:
pip?install?python-docx在使用python-docx讀/寫word文檔中之前,先介紹本文需要用到python-docx模塊的一些概念:
Document對象:表示word文檔。
Paragraph對象:表示word文檔中的段落。
text屬性:表示段落中的文字內容。
style屬性:表示段落文本的樣式,如:Normal(正常)、Title(標題)等。
2. 讀取word文本
以下示例代碼讀取word文檔后,通過paragraph的text和style屬性,查看了段落文字內容及段落樣式。
#?導入模塊 import?docxdef?read_doc(file_input_name)#?獲取輸入文檔對象,file_input_name為待讀取文檔文件doc_obj?=?docx.Document(file_input_name)#?獲取文檔對象的所有段落并統計段落數lenDoc?=?len(doc_obj.paragraphs)print(f"總共{lenDoc}個段落"?)for?paragraph?in?doc_obj.paragraphs:#?查看段落樣式print(paragraph.style.name)#?查看段落文字print(paragraph.text)print("\n")if?__name__?==?'__main__':read_doc("/xxx/xxx/文檔拆分示例.docx")假設處理的文檔文件內容如下:
使用示例代碼,輸出內容如下:
3. 寫入word文本
import?docx?def?write_doc(paragraphs,?file_output_path):#?以首段文字(標題)作為文檔名result_file_name?=?os.path.join(file_output_path,?paragraphs[0]?+?".docx")#?創建文檔對象doc_obj?=?docx.Document()#?添加段落for?paragraph?in?paragraphs:doc_obj.add_paragraph(paragraph)#?保存文件doc_obj.save(result_file_name)示例代碼以段落形式將標題與正文寫入word文件,也就是說新的word文件里所有段落(無論標題還是正文)的style都為Normal。若想要讓標題的style仍然為Title,可使用document.add_heading(paragraphs[0],level = 0)語句。
4. word文本自動拆分
這里給出了一個完整的示例代碼,可以實現對幾十篇文章的word文檔的自動拆分,每篇文章單獨存儲。
示例代碼拆分word文檔思路:通過paragraph的style屬性判斷是否開始下一篇文章,一旦開始下一篇文章,就將前一篇文章的段落寫入一個文件。
寫入文件方式有兩種:word文件(write_doc)、文本文件(write_txt)。
import?os.path import?docxFILE_INPUT?=?r"/xxx/xxx/文檔拆分示例.docx" FILE_OUTPUT?=?r"/xxx/xxx/文檔拆分"def?write_txt(paragraphs,?file_output_path,?doc_count):"""將篇章內容寫入文本文件,以篇章index作為文件名:param?paragraphs:?:param?file_output_path:?:param?doc_count:?:return:?"""txt_path?=?os.path.join(file_output_path,"文本文件")if?not?os.path.exists(txt_path):os.makedirs(txt_path)file_output_name?=?os.path.join(txt_path,str(doc_count)+".txt")paragraphs?=?map(lambda?x:x.strip(),paragraphs)with?open(file_output_name,"w")?as?fw:fw.writelines("\n".join(paragraphs))def?write_doc(paragraphs,?file_output_path):"""將篇章內容寫入word文檔,以篇章標題作為文檔名:param?paragraphs:?:param?file_output_path:?:return:?"""result_file_name?=?os.path.join(file_output_path,?paragraphs[0]?+?".docx")#?創建文檔對象doc_obj?=?docx.Document()#?添加段落for?paragraph?in?paragraphs:doc_obj.add_paragraph(paragraph)#?保存文件doc_obj.save(result_file_name)def?split_doc(file_input_name,?file_output_path):"""拆分word文檔,每個篇章單獨保存:param?file_input_name:?:param?file_output_path:?:return:?"""docs_count?=?0temp_doc?=?[]#?獲取輸入文檔對象doc_obj?=?docx.Document(file_input_name)lenDoc?=?len(doc_obj.paragraphs)print(f"總共{lenDoc}個段落"?)for?paragraph?in?doc_obj.paragraphs:#?開始新篇章if?paragraph.style.name.startswith('Title')?and?len(temp_doc)!=0:#?todo?寫入文件#?todo?清空temp_docwrite_doc(temp_doc,?file_output_path)docs_count?+=1write_txt(temp_doc,?file_output_path,?docs_count)temp_doc?=?[]temp_doc.append(paragraph.text)if?len(temp_doc)!=0:write_doc(temp_doc,?file_output_path)docs_count?+=1write_txt(temp_doc,?file_output_path,?docs_count)print(f"完成文件拆分,共{docs_count}篇章")if?__name__?==?'__main__':split_doc(FILE_INPUT,?FILE_OUTPUT)5. 總結
本文僅從一個使用場景對python-docx展開了介紹。實際上,python-docx模塊還有很多其他用法,比如插入表格、寫word時設置字體字號和顏色等。總之,如果日常需要經常處理word文檔,那非常推薦python-docx。
往期精彩回顧適合初學者入門人工智能的路線及資料下載(圖文+視頻)機器學習入門系列下載中國大學慕課《機器學習》(黃海廣主講)機器學習及深度學習筆記等資料打印《統計學習方法》的代碼復現專輯 AI基礎下載機器學習交流qq群955171419,加入微信群請掃碼:總結
以上是生活随笔為你收集整理的【Python】如何用Python实现Word文档拆分的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一般java,【面试题】java一般
- 下一篇: 【Python】Pandas 数据类型概