1. 程式人生 > >python___docx模組

python___docx模組

一,docx模組

Python可以利用python-docx模組處理word文件,處理方式是面向物件的。也就是說python-docx模組會把word文件,文件中的段落、文字、字型等都看做物件,對物件進行處理就是對word文件的內容處理。

二,相關概念

如果需要讀取word文件中的文字(一般來說,程式也只需要認識word文件中的文字資訊),需要先了解python-docx模組的幾個概念。

1,Document物件,表示一個word文件。
2,Paragraph物件,表示word文件中的一個段落
3,Paragraph物件的text屬性,表示段落中的文字內容。

三,模組的安裝和匯入

需要注意,python-docx模組安裝需要在cmd命令列中輸入pip install python-docx,如下圖表示安裝成功(最後那句英文Successfully installed,成功地安裝完成)

注意在匯入模組時,用的是import docx。

也真是奇了怪了,怎麼安裝和匯入模組時,很多都不用一個名字,看來是很有必要出一個python版本的模組管理程式python-maven了,本段純屬PS。

四,讀取word文字

在瞭解了上面的資訊之後,就很簡單了,下面先建立一個D:\temp\word.docx檔案,並在其中輸入如下內容。

#-*- conding:utf-8 -*-
'''
Created on 2018年7月14日

@author: Administrator
'''
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)+"段的內容是:"+file.paragraphs[i].text)

 

 1 #-*- conding:utf-8 -*-
 2 '''
 3 Created on 2018年7月14日
 4 
 5 @author: Administrator
6 ''' 7 import sys 8 9 from docx import Document 10 from docx.shared import Inches 11 12 def main(): 13 # reload(sys) 14 # sys.setdefaultencoding('utf-8') 15 16 # 建立文件物件 17 document = Document() 18 19 # 設定文件標題,中文要用unicode字串 20 document.add_heading(u'我的一個新文件',0) 21 22 # 往文件中新增段落 23 p = document.add_paragraph('This is a paragraph having some ') 24 p.add_run('bold ').bold = True 25 p.add_run('and some ') 26 p.add_run('italic.').italic = True 27 28 # 新增一級標題 29 document.add_heading(u'一級標題, level = 1',level = 1) 30 document.add_paragraph('Intense quote',style = 'IntenseQuote') 31 32 # 新增無序列表 33 document.add_paragraph('first item in unordered list',style = 'ListBullet') 34 35 # 新增有序列表 36 document.add_paragraph('first item in ordered list',style = 'ListNumber') 37 document.add_paragraph('second item in ordered list',style = 'ListNumber') 38 document.add_paragraph('third item in ordered list',style = 'ListNumber') 39 40 # 新增圖片,並指定寬度 41 document.add_picture('cat.png',width = Inches(2.25)) 42 43 # 新增表格: 1行3列 44 table = document.add_table(rows = 1,cols = 3) 45 # 獲取第一行的單元格列表物件 46 hdr_cells = table.rows[0].cells 47 # 為每一個單元格賦值 48 # 注:值都要為字串型別 49 hdr_cells[0].text = 'Name' 50 hdr_cells[1].text = 'Age' 51 hdr_cells[2].text = 'Tel' 52 # 為表格新增一行 53 new_cells = table.add_row().cells 54 new_cells[0].text = 'Tom' 55 new_cells[1].text = '19' 56 new_cells[2].text = '12345678' 57 58 # 新增分頁符 59 document.add_page_break() 60 61 # 往新的一頁中新增段落 62 p = document.add_paragraph('This is a paragraph in new page.') 63 64 # 儲存文件 65 document.save('demo1.doc') 66 67 if __name__ == '__main__': 68 main()

讀取表格:

#-*- conding:utf-8 -*-
'''
Created on 2018年7月14日

@author: Administrator
'''

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])  # 一行資料
        # print row_str
        for cell in row.cells:
            print(cell.text, '\t',)
        print() #換行

首先是用docx.Document開啟對應的檔案目錄。docx檔案的結構比較複雜,分為三層,1、Docment物件表示整個文件;2、Docment包含了Paragraph物件的列表,Paragraph物件用來表示文件中的段落;3、一個Paragraph物件包含Run物件的列表。 因此p.text會打印出整個的文字文件。而用doc.tables來遍歷所有的表格。並且對每個表格通過遍歷行,列的方式來得到所有的內容。

但是在執行結果中並沒有找到我們插入的檔案物件和圖片,text.txt文件。這部分該如何解析呢。首先我們需要先來認識下docx文件的格式組成:

docx是Microsoft Office2007之後版本使用的,用新的基於XML的壓縮檔案格式取代了其目前專有的預設檔案格式,在傳統的檔名副檔名後面添加了字母“x”(即“.docx”取代“.doc”、“.xlsx”取代“.xls”、“.pptx”取代“.ppt”)。

docx格式的檔案本質上是一個ZIP檔案。將一個docx檔案的字尾改為ZIP後是可以用解壓工具開啟或是解壓的。事實上,Word2007的基本檔案就是ZIP格式的,他可以算作是docx檔案的容器。

docx 格式檔案的主要內容是儲存為XML格式的,但檔案並非直接保存於磁碟。它是儲存在一個ZIP檔案中,然後取副檔名為docx。將.docx 格式的檔案字尾改為ZIP後解壓, 可以看到解壓出來的資料夾中有word這樣一個資料夾,它包含了Word文件的大部分內容。而其中的document.xml檔案則包含了文件的主要文字內容

 

從上面的文件我們可以瞭解到docx文件實際上是由XML文件打包組成的。那麼我們要得到其中所有的部分,可以用ZIP解壓的方式來得到所有的部件。我們先試下看是否可以

1 將docx文件改成ZIP的字尾

2 解壓檔案

解壓之後得到如下幾個檔案

點開word資料夾:有如下的資料夾。document.xml就是描述文字物件的檔案

其中embeddings檔案中就是我們插入的文字物件text.txt. 是一個bin檔案

Media檔案中就是儲存的圖片:

我們通過手動的方式將插入的文字以及圖片解析出來,那麼通過程式碼也是同樣可以解析的。程式碼如下。

os.chdir(r'E:\py_prj')  #首先改變目錄到檔案的目錄

os.rename('test.docx','test.ZIP')  # 重新命名為zip檔案

f=zipfile.ZipFile('test.zip','r')  #進行解壓

for file in f.namelist():

    f.extract(file)

file=open(r'E:\py_prj\word\embeddings\oleObject1.bin','rb').read() #進入檔案路徑,讀取二進位制檔案。

for f in file:

    print f

通過上面的方式,就可以將docx中插入的檔案以及圖片全部解析出來。具體docx的寫的方式可以參考官方文件的介紹


python docx 中文字型設定

解決辦法: 
首先建立一個文件,要先宣告一個document:

from docx import Document
document = Document()

docx內建的樣式都可以通過document.styles取到。

正文是Normal, 標題樣式根據標題宣告的基本,分別從Heading 1 到Heading 9, 另外還有table、list等各種word對應的樣式。可以通過遍歷document.styles檢視。

我們以正文Normal為例。先來看看涉及字型更改的是style object裡面的哪些屬性。

document.styles[‘Normal’].font.name

有興趣深入研究的同學可以看看官方文件對Font的介紹http://python-docx.readthedocs.io/en/latest/dev/analysis/features/text/font.html?highlight=font。 在這裡我們只需要更改font.name。

document.styles[‘Normal’]._element.rPr.rFonts

只更改font.name是不夠的,還需要呼叫._element.rPr.rFonts的set()方法。

綜合起來這樣

from docx.oxml.ns import qn

document.styles['Normal'].font.name = u'宋體'
document.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋體')

  

問題解決, 表格中字型成功更改為”宋體”.