【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

  • 18
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值