python中使用docx模塊處理word文檔
一.docx模塊
Python可以利用python-docx模塊處理word文檔,處理方式是面向?qū)ο蟮?。也就是說(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。
也真是奇了怪了,怎么安裝和導(dǎo)入模塊時(shí),很多都不用一個(gè)名字,看來(lái)是很有必要出一個(gè)python版本的模塊管理程序python-maven了,本段純屬PS。
四.讀取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é)果中并沒(méi)有找到我們插入的文件對(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模塊內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python+wxPython實(shí)現(xiàn)個(gè)人鏈接收藏夾
這篇文章主要介紹了如何使用wxPython和XML數(shù)據(jù)源創(chuàng)建一個(gè)具有按鈕和Web視圖的應(yīng)用程序窗口,以便輕松管理和訪問(wèn)各種網(wǎng)頁(yè)鏈接,感興趣的可以了解下2023-08-08Python argparse模塊應(yīng)用實(shí)例解析
這篇文章主要介紹了Python argparse模塊應(yīng)用實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11python畫圖時(shí)設(shè)置分辨率和畫布大小的實(shí)現(xiàn)(plt.figure())
這篇文章主要介紹了python畫圖時(shí)設(shè)置分辨率和畫布大小的實(shí)現(xiàn)(plt.figure()),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01