ToB企服应用市场:ToB评测及商务社交产业平台

标题: python中可以处理word文档的模块:docx模块 [打印本页]

作者: 莱莱    时间: 2023-1-4 21:22
标题: python中可以处理word文档的模块:docx模块
一.docx模块

Python可以利用python-docx模块处理word文档,处理方式是面向对象的。也就是说python-docx模块会把word文档,文档中的段落、文本、字体等都看做对象,对对象进行处理就是对word文档的内容处理。
二.相关概念

如果需要读取word文档中的文字(一般来说,程序也只需要认识word文档中的文字信息),需要先了解python-docx模块的几个概念。
三.模块的安装和导入

需要注意,python-docx模块安装需要在cmd命令行中输入pip install python-docx,如下图表示安装成功(最后那句英文Successfully installed,成功地安装完成)
注意在导入模块时,用的是import docx。
也真是奇了怪了,怎么安装和导入模块时,很多都不用一个名字,看来是很有必要出一个python版本的模块管理程序python-maven了,本段纯属PS。
四.读取word文本

在了解了上面的信息之后,就很简单了,下面先创建一个D:\temp\word.docx文件,并在其中输入如下内容。
  1. import docx
  2. file=docx.Document(r"F:\python从入门到放弃\7\2\wenjian.docx")
  3. print('段落:'+str(len(file.paragraphs)))
  4. #
  5. # for para in file.paragraphs:
  6. #     print(para.text)
  7.    
  8. for i in range(len(file.paragraphs)):
  9.     print("第"+str(i)+"段的内容是:"+file.paragraphs[i].text)  
复制代码
  1. import sys
  2. from docx import Document
  3. from docx.shared import Inches
  4. def main():
  5. #     reload(sys)
  6. #     sys.setdefaultencoding('utf-8')
  7.     # 创建文档对象
  8.     document = Document()
  9.     # 设置文档标题,中文要用unicode字符串
  10.     document.add_heading(u'我的一个新文档',0)
  11.     # 往文档中添加段落
  12.     p = document.add_paragraph('This is a paragraph having some ')
  13.     p.add_run('bold ').bold = True
  14.     p.add_run('and some ')
  15.     p.add_run('italic.').italic = True
  16.     # 添加一级标题
  17.     document.add_heading(u'一级标题, level = 1',level = 1)
  18.     document.add_paragraph('Intense quote',style = 'IntenseQuote')
  19.     # 添加无序列表
  20.     document.add_paragraph('first item in unordered list',style = 'ListBullet')
  21.     # 添加有序列表
  22.     document.add_paragraph('first item in ordered list',style = 'ListNumber')
  23.     document.add_paragraph('second item in ordered list',style = 'ListNumber')
  24.     document.add_paragraph('third item in ordered list',style = 'ListNumber')
  25.     # 添加图片,并指定宽度
  26.     document.add_picture('cat.png',width = Inches(2.25))
  27.     # 添加表格: 1行3列
  28.     table = document.add_table(rows = 1,cols = 3)
  29.     # 获取第一行的单元格列表对象
  30.     hdr_cells = table.rows[0].cells
  31.     # 为每一个单元格赋值
  32.     # 注:值都要为字符串类型
  33.     hdr_cells[0].text = 'Name'
  34.     hdr_cells[1].text = 'Age'
  35.     hdr_cells[2].text = 'Tel'
  36.     # 为表格添加一行
  37.     new_cells = table.add_row().cells
  38.     new_cells[0].text = 'Tom'
  39.     new_cells[1].text = '19'
  40.     new_cells[2].text = '12345678'
  41.     # 添加分页符
  42.     document.add_page_break()
  43.     # 往新的一页中添加段落
  44.     p = document.add_paragraph('This is a paragraph in new page.')
  45.     # 保存文档
  46.     document.save('demo1.doc')
  47. if __name__ == '__main__':
  48.     main()
复制代码
读取表格:
  1. import docx
  2. doc = docx.Document('wenjian.docx')
  3. for table in doc.tables:  # 遍历所有表格
  4.     print('----table------')
  5.     for row in table.rows:  # 遍历表格的所有行
  6.         # row_str = '\t'.join([cell.text for cell in row.cells])  # 一行数据
  7.         # print row_str
  8.         for cell in row.cells:
  9.             print(cell.text, '\t',)
  10.         print() #换行
复制代码
首先是用docx.Document打开对应的文件目录。
docx文件的结构比较复杂,分为三层,
因此p.text会打印出整个的文本文档。而用doc.tables来遍历所有的表格。并且对每个表格通过遍历行,列的方式来得到所有的内容。
但是在运行结果中并没有找到我们插入的文件对象和图片,text.txt文档。这部分该如何解析呢。首先我们需要先来认识下docx文档的格式组成:
从上面的文档我们可以了解到docx文档实际上是由XML文档打包组成的。那么我们要得到其中所有的部分,可以用ZIP解压的方式来得到所有的部件。
我们先试下看是否可以
1 将docx文档改成ZIP的后缀
2 解压文件
解压之后得到如下几个文件

点开word文件夹:有如下的文件夹。document.xml就是描述文本对象的文件

其中embeddings文件中就是我们插入的文本对象text.txt. 是一个bin文件

Media文件中就是存储的图片:

我们通过手动的方式将插入的文本以及图片解析出来,那么通过代码也是同样可以解析的。代码如下。
  1. os.chdir(r'E:\py_prj')  #首先改变目录到文件的目录
  2. os.rename('test.docx','test.ZIP')  # 重命名为zip文件
  3. f=zipfile.ZipFile('test.zip','r')  #进行解压
  4. for file in f.namelist():
  5.     f.extract(file)
  6. file=open(r'E:\py_prj\word\embeddings\oleObject1.bin','rb').read() #进入文件路径,读取二进制文件。
  7. for f in file:
  8.     print (f)
复制代码
通过上面的方式,就可以将docx中插入的文件以及图片全部解析出来。
具体docx的写的方式可以参考官方文档的介绍

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4