Python使用docx模塊處理word文檔流程詳解
一.docx模塊
Python可以利用python-docx模塊處理word文檔,處理方式是面向?qū)ο蟮摹?/p>
也就是說(shuō)python-docx模塊會(huì)把word文檔,文檔中的段落、文本、字體等都看做對(duì)象,對(duì)對(duì)象進(jìn)行處理就是對(duì)word文檔的內(nèi)容處理。
二.相關(guān)概念
如果需要讀取word文檔中的文字(一般來(lái)說(shuō),程序也只需要認(rèn)識(shí)word文檔中的文字信息),需要先了解python-docx模塊的幾個(gè)概念。
- Document對(duì)象,表示一個(gè)word文檔。
- Paragraph對(duì)象,表示word文檔中的一個(gè)段落
- Paragraph對(duì)象的text屬性,表示段落中的文本內(nèi)容。
三.模塊的安裝和導(dǎo)入
需要注意,python-docx模塊安裝需要在cmd命令行中輸入pip install python-docx,
如下圖表示安裝成功(最后那句英文Successfully installed,成功地安裝完成)
注意:在導(dǎo)入模塊時(shí),用的是import docx
。
四.讀取word文本
在了解了上面的信息之后,就很簡(jiǎn)單了,
下面先創(chuàng)建一個(gè)D:\temp\word.docx文件,并在其中輸入如下內(nèi)容。
import docx file=docx.Document(r"F:\python從入門到放棄\7\2\wenjian.docx") print('段落:'+str(len(file.paragraphs))) # # for para in file.paragraphs: # print(para.text) for i in range(len(file.paragraphs)): print("第"+str(i)+"段的內(nèi)容是:"+file.paragraphs[i].text)
import sys from docx import Document from docx.shared import Inches def main(): # reload(sys) # sys.setdefaultencoding('utf-8') # 創(chuàng)建文檔對(duì)象 document = Document() # 設(shè)置文檔標(biāo)題,中文要用unicode字符串 document.add_heading(u'我的一個(gè)新文檔',0) # 往文檔中添加段落 p = document.add_paragraph('This is a paragraph having some ') p.add_run('bold ').bold = True p.add_run('and some ') p.add_run('italic.').italic = True # 添加一級(jí)標(biāo)題 document.add_heading(u'一級(jí)標(biāo)題, level = 1',level = 1) document.add_paragraph('Intense quote',style = 'IntenseQuote') # 添加無(wú)序列表 document.add_paragraph('first item in unordered list',style = 'ListBullet') # 添加有序列表 document.add_paragraph('first item in ordered list',style = 'ListNumber') document.add_paragraph('second item in ordered list',style = 'ListNumber') document.add_paragraph('third item in ordered list',style = 'ListNumber') # 添加圖片,并指定寬度 document.add_picture('cat.png',width = Inches(2.25)) # 添加表格: 1行3列 table = document.add_table(rows = 1,cols = 3) # 獲取第一行的單元格列表對(duì)象 hdr_cells = table.rows[0].cells # 為每一個(gè)單元格賦值 # 注:值都要為字符串類型 hdr_cells[0].text = 'Name' hdr_cells[1].text = 'Age' hdr_cells[2].text = 'Tel' # 為表格添加一行 new_cells = table.add_row().cells new_cells[0].text = 'Tom' new_cells[1].text = '19' new_cells[2].text = '12345678' # 添加分頁(yè)符 document.add_page_break() # 往新的一頁(yè)中添加段落 p = document.add_paragraph('This is a paragraph in new page.') # 保存文檔 document.save('demo1.doc') if __name__ == '__main__': main()
讀取表格:
import docx doc = docx.Document('wenjian.docx') for table in doc.tables: # 遍歷所有表格 print('----table------') for row in table.rows: # 遍歷表格的所有行 # row_str = '\t'.join([cell.text for cell in row.cells]) # 一行數(shù)據(jù) # print row_str for cell in row.cells: print(cell.text, '\t',) print() #換行
首先是用docx.Document打開對(duì)應(yīng)的文件目錄。
docx文件
的結(jié)構(gòu)比較復(fù)雜,分為三層,
- Docment對(duì)象表示整個(gè)文檔;
- Docment包含了Paragraph對(duì)象的列表,Paragraph對(duì)象用來(lái)表示文檔中的段落;
- 一個(gè)Paragraph對(duì)象包含Run對(duì)象的列表。
因此p.text會(huì)打印出整個(gè)的文本文檔。而用doc.tables來(lái)遍歷所有的表格。
并且對(duì)每個(gè)表格通過(guò)遍歷行,列的方式來(lái)得到所有的內(nèi)容。
但是在運(yùn)行結(jié)果中并沒有找到我們插入的文件對(duì)象和圖片,text.txt
文檔。
這部分該如何解析呢?
首先我們需要先來(lái)認(rèn)識(shí)下docx文檔的格式組成:
docx是Microsoft Office2007之后版本使用的,
用新的基于XML的壓縮文件格式取代了其目前專有的默認(rèn)文件格式,
在傳統(tǒng)的文件名擴(kuò)展名后面添加了字母“x”
(即“.docx”取代“.doc”、“.xlsx”取代“.xls”、“.pptx”取代“.ppt”
)。
docx格式的文件本質(zhì)上是一個(gè)ZIP文件。
將一個(gè)docx文件的后綴改為ZIP后是可以用解壓工具打開或是解壓的。
事實(shí)上,Word2007的基本文件就是ZIP格式的,他可以算作是docx文件的容器。
docx 格式文件的主要內(nèi)容是保存為XML格式的,但文件并非直接保存于磁盤。
它是保存在一個(gè)ZIP文件中,然后取擴(kuò)展名為docx。
將.docx 格式的文件后綴改為ZIP后解壓,
可以看到解壓出來(lái)的文件夾中有word這樣一個(gè)文件夾,
它包含了Word文檔的大部分內(nèi)容。
而其中的document.xml
文件則包含了文檔的主要文本內(nèi)容
從上面的文檔我們可以了解到docx文檔實(shí)際上是由XML文檔打包組成的。
那么我們要得到其中所有的部分,可以用ZIP解壓的方式來(lái)得到所有的部件。
我們先試下看是否可以
1 將docx文檔改成ZIP的后綴
2 解壓文件
解壓之后得到如下幾個(gè)文件
點(diǎn)開word文件夾:有如下的文件夾。
document.xml就是描述文本對(duì)象的文件
其中embeddings文件中就是我們插入的文本對(duì)象text.txt. 是一個(gè)bin文件
Media文件中就是存儲(chǔ)的圖片:
我們通過(guò)手動(dòng)的方式將插入的文本以及圖片解析出來(lái),那么通過(guò)代碼也是同樣可以解析的。
代碼如下:
os.chdir(r'E:\py_prj') #首先改變目錄到文件的目錄 os.rename('test.docx','test.ZIP') # 重命名為zip文件 f=zipfile.ZipFile('test.zip','r') #進(jìn)行解壓 for file in f.namelist(): f.extract(file) file=open(r'E:\py_prj\word\embeddings\oleObject1.bin','rb').read() #進(jìn)入文件路徑,讀取二進(jìn)制文件。 for f in file: print (f)
通過(guò)上面的方式,就可以將docx中插入的文件以及圖片全部解析出來(lái)。
具體docx的寫的方式可以參考官方文檔的介紹
到此這篇關(guān)于Python使用docx模塊處理word文檔流程詳解的文章就介紹到這了,更多相關(guān)Python docx模塊處理word文檔內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決Python pandas df 寫入excel 出現(xiàn)的問(wèn)題
今天小編就為大家分享一篇解決Python pandas df 寫入excel 出現(xiàn)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07PyQt5 QTableView設(shè)置某一列不可編輯的方法
今天小編就為大家分享一篇PyQt5 QTableView設(shè)置某一列不可編輯的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-06-06對(duì)python dataframe邏輯取值的方法詳解
今天小編就為大家分享一篇對(duì)python dataframe邏輯取值的方法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01通過(guò)Python實(shí)現(xiàn)猜燈謎游戲的示例代碼
新的一年迎來(lái)了元宵節(jié),元宵佳節(jié)在陪伴家人的同時(shí),自然也少不了賞花燈,猜燈謎的項(xiàng)目。本文會(huì)通過(guò)Python實(shí)現(xiàn)這一游戲,需要的可以參考一下2022-02-02詳解Python實(shí)現(xiàn)圖像分割增強(qiáng)的兩種方法
圖像分割就是把圖像分成若干個(gè)特定的、具有獨(dú)特性質(zhì)的區(qū)域并提出感興趣目標(biāo)的技術(shù)和過(guò)程。本文將為大家分享兩個(gè)用Python實(shí)現(xiàn)像分割增強(qiáng)的方法,需要的可以參考一下2022-03-03Pycharm虛擬環(huán)境pip時(shí)報(bào)錯(cuò):no?suchoption:--bulid-dir的解決辦法
最近在工作中遇到了些問(wèn)題,想著大家應(yīng)該也會(huì)遇到過(guò),所以給大家總結(jié)下,這篇文章主要給大家介紹了關(guān)于Pycharm虛擬環(huán)境pip時(shí)報(bào)錯(cuò):no?suchoption:?--bulid-dir的解決辦法,需要的朋友可以參考下2022-07-07