前言:

前两篇博客介绍了 Python 的 docx 模块对 Word 文档的写操作,这篇博客将介绍如何用 docx 模块读取已有 Word 文档中的信息。

本篇博客主要内容有:

1、获取文档的章节信息;

2、获取段落文本信息;

3、获取表格内文本信息;

4、获取文档内格式信息。

1、获取文档章节信息:

1、用docx模块获取已有的word文档对象:

  1. from docx import Document
  2. # Document 类,不仅可以新建word文档,也可以打开一个本地文档
  3. doc = Document('test03.docx') # 想获取的文档文件名,这里是相对路径。

用做示例的 test03.docx 文件截图如下:



文档中有两个章节共两页(一个章节一页),一个章节的页面为 A3 ,另一个为 A4。

2、获取文档章节信息:

  1. # 获取文档所有章节
  2. sections = doc.sections
  3. "class Sections(Sequence):"
  4. print(sections)
  5. # <docx.section.Sections object at 0x000000000B2E1148>
  6. # 查看章节数量
  7. print(len(sections)) # 2

注意:

章节对象的概念虽然比段落对象大,章节对象可以设置本章节的页面大小页眉页脚等,在该章节的段落对象必须遵守该章节的设置。

但是又并不存在包含关系,也就是说不能通过章节对象获取到段落信息。

3、获取页边距等信息:

  1. # 获取章节对象的页边距等信息
  2. sec0 = sections[0]
  3. "class Section(object):"
  4. '''
  5. 官方解释:文档节,提供对节和页面设置的访问。
  6. 还提供对页眉和页脚的访问。
  7. '''
  8. print(sec0)
  9. # <docx.section.Section object at 0x000000000B2D5708>
  10. # 获取章节页面信息
  11. # 获取页面边距值:(单位为像素)
  12. print('左边距:',sec0.left_margin)
  13. # 左边距: 914400
  14. print('右边距:',sec0.right_margin)
  15. # 右边距: 914400
  16. print('上边距:',sec0.top_margin)
  17. # 上边距: 1143000
  18. print('下边距:',sec0.bottom_margin)
  19. # 下边距: 1143000
  20. print('页眉边距:',sec0.header_distance)
  21. # 页眉边距: 540385
  22. print('页脚边距:',sec0.footer_distance)
  23. # 页脚边距: 629920
  24. print('页面方向:',sec0.orientation)
  25. # 页面方向: LANDSCAPE (1)
  26. print('页面高度:',sec0.page_height)
  27. # 页面高度: 10657205
  28. print('页面宽度:',sec0.page_width)
  29. # 页面宽度: 15085695

这里获取的是第一个章节的页面信息,也就是 A3 页面的信息。

注:上一篇博客 往Word文档中插入图片、表格,设置表格样式,章节,页眉页脚等,在介绍设置页面信息时,忘记介绍如何设置页面方向了,这里补充一下:

设置页面方向:

  1. # 导入设置页面方向所需模块
  2. from docx.enum.section import WD_ORIENT
  3. # 获取章节对象
  4. section = document.sections[0]
  5. # 设置页面方向
  6. section.orientation = WD_ORIENT.LANDSCAPE # 横向

可设置项有横向( LANDSCAPE ) 和纵向 ( PORTRAIT ):

  1. '''
  2. 'PORTRAIT', 0, 'portrait', 'Portrait orientation.'
  3. 'LANDSCAPE', 1, 'landscape', 'Landscape orientation.'
  4. '''

文档截图:



4、获取文档页眉页脚信息:

  1. head0 = sec0.header # 获取页眉对象
  2. print(head0)
  3. # <docx.section._Header object at 0x000000000B2E1348>
  4. head0_pars = head0.paragraphs # 获取 页眉 paragraphs
  5. # 获取页眉文字信息
  6. # 因存在多个 paragraph 对象的可能所以用循环读取的方式
  7. head0_string = ''
  8. for par in head0_pars:
  9. head0_string += par.text
  10. print(head0_string)
  11. # 仪征市马集镇总体规划(2017-2030)——说明
  12. # 获取页脚信息,也是类似的方法
  13. foot0 = sec0.footer
  14. print(foot0) # 获取页脚对象
  15. # <docx.section._Footer object at 0x000000000B2E3808>
  16. foot0_pars = foot0.paragraphs
  17. foot0_string = ''
  18. for par in foot0_pars:
  19. foot0_string += par.text
  20. print(foot0_string)
  21. # 1

2、获取段落文字信息:

1、获取Word文档所有段落对象:

  1. "获取文档所有段落信息:"
  2. # 获取文档所有段落对象
  3. paragraphs = doc.paragraphs

注意:

paragraphs 获取的是文档中所有段落对象的列表,严格来说是word文档中正文部分的段落对象列表。因为通过前文的介绍,许多除正文部分,如 表格,页面页脚等元素也包含 paragraph 对象。

而 doc.paragraphs 获取到的 paragraph 不包含这些段落对象。

2、获取段落对象文字信息:

  1. print(paragraphs)
  2. print(len(paragraphs)) # 打印结果:20
  3. # 获取一个段落对象的文字信息
  4. par0 = paragraphs[0]
  5. print(par0)
  6. par0_string = par0.text
  7. print(par0_string)
  8. # 获取所有段落文字信息
  9. pars_string = [par.text for par in paragraphs]
  10. print(pars_string)

par0_string 打印截图:



3、获取段落格式信息:

  1. print('段落对齐方式:',par0.paragraph_format.alignment)
  2. # 段落对齐方式: LEFT (0)
  3. print('左缩进:',par0.paragraph_format.left_indent)
  4. # 左缩进: None
  5. print('右缩进:',par0.paragraph_format.right_indent)
  6. # 右缩进: None
  7. print('首行缩进:',par0.paragraph_format.first_line_indent)
  8. # 首行缩进: 304800
  9. print('行间距:',par0.paragraph_format.line_spacing)
  10. # 行间距: 1.5
  11. print('段前间距:',par0.paragraph_format.space_before)
  12. # 段前间距: 198120
  13. print('段后间距:',par0.paragraph_format.space_after)
  14. # 段后间距: 198120

    LIK1

3、获取文字格式信息:

paragraph 对象 里还有更小的 run 对象,run 对象才包含了段落对象的文字信息。

paragraph.text 方法也是通过 run 对象的方法获取到文字信息的:

paragraph.text 方法源码:

  1. def text(self):
  2. text = ''
  3. for run in self.runs:
  4. text += run.text
  5. return text

文字的字体、大小、下划线等信息都包含在 run 对象中(不清楚的看前面的博客):

  1. # 获取段落的 run 对象列表
  2. runs = par0.runs
  3. print(runs)
  4. # 获取 run 对象
  5. run_0 = runs[0]
  6. print(run_0.text) # 获取 run 对象文字信息
  7. # 打印结果:
  8. # 坚持因地制宜,差异化打造特色小镇,

文档 段落 和 run 对象示意:



获取文字格式信息:

  1. # 获取文字格式信息
  2. print('字体名称:',run_0.font.name)
  3. # 字体名称: 宋体
  4. print('字体大小:',run_0.font.size)
  5. # 字体大小: 152400
  6. print('是否加粗:',run_0.font.bold)
  7. # 是否加粗: None
  8. print('是否斜体:',run_0.font.italic)
  9. # 是否斜体: True
  10. print('字体颜色:',run_0.font.color.rgb)
  11. # 字体颜色: FF0000
  12. print('字体高亮:',run_0.font.highlight_color)
  13. # 字体高亮: YELLOW (7)
  14. print('下划线:',run_0.font.underline)
  15. # 下划线: True
  16. print('删除线:',run_0.font.strike)
  17. # 删除线: None
  18. print('双删除线:',run_0.font.double_strike)
  19. # 双删除线: None
  20. print('下标:',run_0.font.subscript)
  21. # 下标: None
  22. print('上标:',run_0.font.superscript)
  23. # 上标: None
    LIK2

注:前面的博客好像也没介绍文字背景颜色的设置…

背景颜色设置方法: (与字体颜色设置方法有区别)

  1. # 设置背景颜色
  2. from docx.enum.text import WD_COLOR_INDEX
  3. run_2.font.highlight_color = WD_COLOR_INDEX.YELLOW

背景颜色可选值有:

  1. '''
  2. 'AUTO', 0, 'default'
  3. 'BLACK', 1, 'black'
  4. 'BLUE', 2, 'blue'
  5. 'BRIGHT_GREEN', 4, 'green',
  6. 'DARK_BLUE', 9, 'darkBlue',
  7. 'DARK_RED', 13, 'darkRed'
  8. 'DARK_YELLOW', 14, 'darkYellow'
  9. 'GRAY_25', 16, 'lightGray'
  10. 'GRAY_50', 15, 'darkGray'
  11. 'GREEN', 11, 'darkGreen'
  12. 'PINK', 5, 'magenta'
  13. 'RED', 6, 'red'
  14. 'TEAL', 10, 'darkCyan'
  15. 'TURQUOISE', 3, 'cyan'
  16. 'VIOLET', 12, 'darkMagenta'
  17. 'WHITE', 8, 'white'
  18. 'YELLOW', 7, 'yellow'
  19. '''LIK3

4、获取文档中表格信息:

示例文档中表格截图:



1、获取表格样式、单元格对象及文字信息:

  1. # 获取文档中表格信息
  2. tables = doc.tables # 获取文档中所有表格对象的列表
  3. print(tables)
  4. # [<docx.table.Table object at 0x000001957059CD48>]
  5. print(len(tables)) # 查看文档中表格数量
  6. # 1
  7. table0 = tables[0] # 获取表格对象
  8. # 获取表格的样式信息
  9. print(table0.style)
  10. # _TableStyle('Normal Table') id: 190621384
  11. # 获取一个表格的所有单元格
  12. cells = table0._cells
  13. print(len(cells)) # 表格中单元格数量
  14. # 15
  15. # 获取单元格内所有文字信息
  16. cells_string = [cell.text for cell in cells]
  17. print(cells_string)
  1. LIK4

cells_string 打印截图:



从截图中可以看出来,用 tableobj._cells 获取到的单元格对象列表是按行排列的。

2、获取表格的行列对象:

  1. # 获取表格对象行数量、列数量
  2. col_num = len(table0.columns)
  3. print(col_num) # 3
  4. # 行数量
  5. row_num = len(table0.rows)
  6. print(row_num) # 5
  7. # 获取行对象
  8. row0 = table0.rows[0]
  9. # 获取列对象
  10. col0 = table0.columns[0]
  11. # 获取行对象文字信息
  12. '要用 row0.cells 获取行对象的 cell 才能获取其文字信息'
  13. row0_string = [cell.text for cell in row0.cells]
  14. print(row0_string)
  15. # 获取列对象文字信息
  16. col0_string = [cell.text for cell in col0.cells]
  17. print(col0_string)
    LIK5

注:在介绍单元格格式信息时,说过单元格内文字信息也是通过 run 对象设置,故获取文字信息也和前面获取段落文字信息类似,就不重复讲了。

结尾:

以上就是本篇博客的全部内容了,后面将会用两个实例来将前面三篇博客的知识点串联起来,感谢阅读。

【Python与Office】专栏

该专栏会对 Python 的第三方模块,如:xlwt,xlrd,python-docx等,操作 Office 办公软件(Word Excel PPT)的方法进行详细讲解。同时也会搭配一些实例演练,一方面强化知识点的理解与运用,另一方面也希望能起到,引导读者进行思考:如何用 python 提高 offic 办公软件办公效率的作用。

感兴趣的朋友,可以点个 关注收藏 。如在博客中遇到任何问题或有一些想法、需求,可留言或私信。

创作不易,你的支持是我最大的动力,感谢 !

利用Python-docx 读写 Word 文档中的正文、表格、段落、字体等的更多相关文章

  1. Python批量创建word文档(1)- 纯文字

    Python创建word文档,任务要求:小杨在一家公司上班,每天都需要给不同的客户发送word文档,以告知客户每日黄金价格.最后贴上自己的联系方式.代码如下: 1 ''' 2 #python根据需求新 ...

  2. 2018-10-04 [日常]用Python读取word文档中的表格并比较

    最近想对某些word文档(docx)的表格内容作比较, 于是找了一下相关工具. 参考Automate the Boring Stuff with Python中的word部分, 试用了python-d ...

  3. 利用POI操作不同版本号word文档中的图片以及创建word文档

    我们都知道要想利用java对office操作最经常使用的技术就应该是POI了,在这里本人就不多说到底POI是什么和怎么用了. 先说本人遇到的问题,不同于利用POI去向word文档以及excel文档去写 ...

  4. 利用POI工具读取word文档并将数据存储到sqlserver数据库中

    今天实现了利用POI工具读取word文档,并将数据存储到sql数据库中,代码如下: package word; import java.io.File; import java.io.FileInpu ...

  5. 使用 python 创建&更改 word 文档

    使用 python 修改 word 文档 说明:这个需求是老师想要一个自动识别 word 文档中指定位置的分数,并填入相应表格. 使用库 python-docx 的官方文档地址是:python-doc ...

  6. 处理Word文档中所有修订

    打开现有文档进行编辑 若要打开现有文档,您可以将 Word类实例化,如以下 using 语句所示. 为此,您可以使用Open(String, Boolean) 方法打开具有指定 fileName 的字 ...

  7. python3在word文档中查找多行文字是否存在

    工作中碰到这样一个情况:有多个关键词存在文本文档txt中,想查找下在某个较大的word文档中,这些关键词是否都含有,没有关键词的显示出来. 因为关键词比较多,并且这个工作还是经常会有的,这个情况我试着 ...

  8. C# 在Word文档中生成条形码

    C# 在Word文档中生成条形码 简介 条形码是由多个不同的空白和黑条按照一定的顺序组成,用于表示各种信息如产品名称.制造商.类别.价格等.目前,条形码在我们的日常生活中有着很广泛的应用,不管是在图书 ...

  9. C# 提取Word文档中的图片

    C# 提取Word文档中的图片 图片和文字是word文档中两种最常见的对象,在微软word中,如果我们想要提取出一个文档内的图片,只需要右击图片选择另存为然后命名保存就可以了,今天这篇文章主要是实现使 ...

随机推荐

  1. Asp.net core验证类ModelStateDictionary的bug

    在使用.net core 3.1 时发现明明没有验证请求类属性,甚至已经加了默认值 但是验证类时依然会报错 经过网上百度等搜索,尝试使用可空类型赋值默认值 果然验证类没有报错 不清楚是微软的bug还是 ...

  2. LLVM程序分析日记之插桩BranchInst

    1. splitblockandinsertifthenelse() 一个代码例子:StackOverflow 2. SplitBlockAndInsertIfThen() 或者仅仅想插桩if the ...

  3. swig python dynamic module does not define init function

    example_module = Extension('_example', sources=['example_wrap.c', 'example.c'], ) setup (name = 'exa ...

  4. ES6新增数据类型Symbol

    Symbol的含义? ES6(2015) 引入了第七种原始数据类型Symbol,Symbol英文文意思为 符号.象征.标记.记号,在 js 中更确切的翻译应该为独一无二的 Symbol的使用? Sym ...

  5. .net core 3.1 过滤器(Filter) 与中间件与AOP面向切面 与拦截器及其应用

    Filter(过滤器) 总共有五种,Authorization Filter,Resource Filter,Exception Filter,Action Filter,Result Filter ...

  6. 企业运维案例:xxx is not in the sudoers file.This incident will be reported” 错误解决方法

    CentOS6系统下,普通用户使用sudo执行命令时报错: xxx is not in the sudoers file.This incident will be reported" 解决 ...

  7. (四)linux的常用环境变量及设置

    一.为什么要设置环境变量 1.环境变量能解决什么问题? 你是否经历过输入$python命令后,屏幕上打印出python:command not found的尴尬:每一次都要输入$/home/tools ...

  8. 论文阅读LR LIO-SAM

    Abstract 紧耦合lidar inertial里程计, 用smoothing和mapping. 1. Introduction 紧耦合lidar-inertial里程计. 紧耦合的lidar i ...

  9. “You may need an appropriate loader to handle this file type”

    这里不能为空!!!!!!!!!!!!!!!!!!!!

  10. Linux下nginx反向代理负载均衡几种方式以及配置

    下面以ip地址192.168.1.1 和192.168.1.2举例 1.轮询   (1).轮询:每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除.  upstream ...