【python-docx】Python讀寫Word文件

python-docx是一個在Python環境下讀寫word文檔的“利器”。在使用前可以通過 pip install python-docx 命令安裝,再通過import docx 引用即可。下面簡單介紹一下 python-docx 的基本操作。

1、新建/打開及保存

文檔的新建和打開比較簡單,只需要用docx的Document類,若指定路徑則是打開文檔;若沒有指定路徑則是新建文檔。

對文檔的操作結束後可以通過Document類的save方法進行保存,其中參數是保存的文件路徑,或者要保存的文件流。一般指定路徑即可。

doc = docx.Document('D:\project\python\docx\test.docx') #打開文檔
doc_new = docx.Document()  #新建文檔

doc.save()  #保存
doc_new.save('D:\project\python\docx\1.docx')  #保存

2. 對象操作

python-docx包含了word文檔的相關對象集合,如段落(doc.paragraphs)、表格(doc.tables)、節(doc.sections)、樣式(doc.styles)、內置圖形(doc.inline_shapes)等等。我們可以通過這些對象集合進行信息讀取。在這裏我主要說一下段落和表格的操作吧。

2.1 doc.paragraphs

在docx中,可以通過 doc.paragraphs 訪問word中的段落信息。

我們通過 print(doc.paragraphs) 和 print(type(doc.paragraphs))  可以知道,doc.paragraphs給出的是一個包含paragraph對象的list。我們可以通過 len(doc.paragraphs)  查看段落的數量。

print(doc.paragraphs)
print(type(doc.paragraphs)) #<class 'list'>
print(len(doc.paragraphs)) #9

如果想訪問文檔的具體內容,可以通過遍歷的方式,利用 doc.paragraphs.text 的命令來讀取,也可以通過制定的下標訪問制定段落。

for i in doc.paragraphs:  #遍歷全部段落
    print(i.text)    #提取段落內容

print(doc.paragraphs[1]) #訪問具體段落

 不過,上述方式僅僅是獲得了文字內容,而把格式全忽略了。比如加粗、顏色、居中等等。在paragraph中,這些東西叫做run。一個Run對象就是style相同的一段文本,一個段落是由許多run組成的,就像這樣:

我們可以通過runs分割、獲取文本:

print(doc.paragraphs[1].text) #訪問具體段落
print(doc.paragraphs[1].runs)
print(len(doc.paragraphs[1].runs))  
print(doc.paragraphs[1].runs[1].text)

運行結果如下: 

通過python-docx,我們不僅可以讀出paragraph的內容,還進行寫入和修改。修改比較簡單,直接給text賦值就行:

print(doc.paragraphs[1].runs[3].text)
doc.paragraphs[1].runs[3].text="不傷悲" #修改文字
print(doc.paragraphs[1].text)

處理剛纔“芙蓉如面柳如眉,對此如何不淚垂”那一句,運行結果如下: 

添加內容可以使用 add_paragraph()  add_run()方法來進行:

import docx

doc = docx.Document('1.docx')

#在文檔末尾添加段落
doc.add_paragraph(u'北方有佳人,遺世而獨立',style=None)
doc.add_paragraph(u'一顧傾人城,再顧傾人國',style='Heading 2')

#在段落末尾添加文字
q=doc.paragraphs[2]
q.add_run(u'愛而不見,搔首踟躕',style=None)

doc.save('1_new.docx')

運行結果如下:

也可以對文字的樣式進行設置。

import docx

doc = docx.Document('1.docx')

r=doc.paragraphs[2].runs[0]
print(r.text) #運行結果:靜女其姝,俟我於城隅
r.font.bold = True    #加粗
r.font.italic = True  #傾斜

doc.save('1_new.docx')

結果如下:

2.2 doc.tables

在用docx處理word文件時,段落是可以用paragraph處理的,如果word中有表格,用 doc.paragraphs 根本讀都讀不到,因爲表格在docx中是另一個類。要對錶格進行操作,就需要用到 doc.tables 了。

我們可以通過下面的方式在.docx文件中添加表格:

table=doc.add_table(rows=2,cols=3,style=None)

接下來,我們用下面這個文檔來作爲例子,請記住它的樣子:

doc.paragraphs類似,通過 doc.tables,我們可以獲得文檔中的全部表格,這也是個 list。但是但是表格是不能直接讀的,因爲我們知道表格的操作對象其實是“單元格”。我們可以分別對錶格進行行(row)、列(column)、單元格(cell)的操作:

import docx

doc = docx.Document('2.docx')

print(type(doc.tables))   #<class 'list'>
print(len(doc.tables))   #2

#可以通過len(table.rows) 和 len(table.colums)讀取表格的行和列
for i in doc.tables:
    print(len(i.rows),"*",len(i.columns))  
#運行結果: 4*3
#          2*5

如果要遍歷表格中的元素,可以使用一下幾種方式,自己寫的,可能還有別的更好的方法:

#方法一:每一行遍歷,同理也可以按每一列遍歷
for i in range(0,len(table.rows)):
    for j in table.rows[i].cells:
        print(j.text)

#方法二:根據單元格下標依次遍歷
for i in range(0,len(table.rows)):
    for j in range(0,len(table.columns)):
        print(table.cell(i,j).text)

通過遍歷,我們可以查找表格中的數據或者找到對應單元格的位置。

for i in range(0,len(table.rows)):
    for j in range(0,len(table.columns)):
        if table.cell(i,j).text=="表格1-A21":
            print(i,",",j)  
#運行結果:2 , 1

要想提取表格中的內容,我們最好引入一個list對象用於保存數據:

import docx

doc = docx.Document('2.docx')
table=doc.tables[0]

_table_list = [] #用於保存表格內容

for i, row in enumerate(table.rows):   # 讀每行
    row_content = [] #用於保存每行內容
    for cell in row.cells:  # 讀一行中的所有單元格
        c = cell.text
        if c not in row_content:
            row_content.append(c)
    _table_list.append(row_content)

for i in _table_list:
    print(i)

運行結果如下:

要改變單元格中的內容也非常簡單,直接對text賦值即可。如:

table.cell(2,2).text="王明"

表格中還需注意的是,對於合併單元格,其實它還是默認之前的行數或者列數:

import docx

doc = docx.Document('2.docx')

#例1
table_2 = doc.tables[1]
n = 0
for i in range(0, len(table_2.rows)):
    for j in range(0, len(table_2.columns)):
        if table_2.cell(i, j).text == "表格2-B1":
            n += 1

print(n)  #運行結果:2

#例2
for i in range(0,len(table_2.rows)):
    for j in range(0,len(table_2.columns)):
        if table_2.cell(i,j).text=="表格2-B2":
            print(i,",",j)
#運行結果:0,1
#         0,2
#         0,3
#         0.4

要想增加表格的行數或者列數,可以使用 table.add_row() 或 table.add_column():

import docx

doc = docx.Document('2.docx')

table=doc.tables[0]

table.add_row()
table.add_column(10) #需要指明列寬

doc.save("2_new.docx")

運行結果如下:

 我們現在把原文件中的表格1中的文字格式變爲:藍色,加粗。如果我們通過直接賦值的方法修改其中單元格中的內容,結果如下,可以看到修改後的內容有一個默認的文字格式。

如果我們想在不改變單元格文字樣式的情況下修改內容應該怎麼辦呢?只需要改一下賦值代碼:

import docx

doc = docx.Document('2.docx')

table=doc.tables[0]

#table.cell(2,2).text= '修改'  #修改後內容以默認格式顯示
table.cell(2,2).paragraphs[0].runs[0].text= '修改'  #僅修改文字,保留原來的格式

doc.save("2_new.docx")

好了,docx最基礎的使用就講到這裏了,當然還有非常多其他的操作,以後用到了再慢慢總結。Bye~


參考:

https://www.cnblogs.com/wrajj/p/4914102.html

https://www.cnblogs.com/anpengapple/p/8372958.html

https://www.cnblogs.com/anpengapple/p/8372987.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章