IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> python-docx获取word的自动编号 -> 正文阅读

[Python知识库]python-docx获取word的自动编号

作者:recommend-item-box type_blog clearfix

刚毕业的小菜鸡,第一次写文章,如果有写的不好的地方请谅解。

目录

1.word文档分析

2.python-docx获取word中的自动编号

3.尚未解决的问题


1.word文档分析

word文档是一种压缩包,将后缀名改为zip之后,"word"文件夹里有一个document.xml和numbering.xml,一个放word文档中的文本,一个放word文档中的自动编号。

?

?每一个段落都有一个numbId和ilvl

?再来看numbering.xml文件,这个文件出去开头的引用东西,文件中部列举了不同的abstractNumId对应的编号的类型,文件的最下部写了numId和abstractNumId的对应关系。

?文本每段会分配一个numIdilvl,每个numId对应一个abstractNumId,每个abstractNumId对应一组格式,这个格式是个序列通过ilvl的值作为索引。document.xml文件中需要的标签的作用:

<w:ilvl?w:val="0"/>: 用来确定是同个abstractNumId的不同格式

<w:numId?w:val="1"/>:每个numId对应一个abstractNumId,一种自动编号用两次就会生成两个numId,两个abstracNumId。如一、......二、......,此时这两段标题的numId是一样的。如一、......一、......,此时这两段的numId是不同的,相应的会对应两个不同的abstractNumId。不带自动编号的段落的numId为0,且没有对应的abstractNumId

numbering.xml文件中的需要的标签的作用:

<w:abstractNum?w:abstractNumId="17">:对应一组格式

<w:lvl?w:ilvl="0"?w:tentative="0">:对应这一组格式中的一种格式

?<w:start?w:val="1"/>:表示这格式从几开始,如为1时,一、,为二时,二、。这个值只是表示这格式时从几开始自动编号,不是表示编号的顺序。

<w:numFmt?w:val="decimal"/>:表示这种格式是什么类型的

<w:lvlText?w:val="%1、"/>:表示这种格式的样式。

简单叙述一下word怎么实现自动编号的,带编号的段落在document.xml生成一个numId和ilvl,每个numId对应一个abstractNumId,每个abstractNumId有一组格式序列,每个ilvl对应改组格式序列的一种格式。每个格式有start确定起始编号,numFmt确定格式类型,lvlText确定格式样式。通过numFmt和lvlText的组合确定自动编号的最终的样式。

2.python-docx获取word中的自动编号

了解word的文件构成之后,利用python-docx获取上述的信息。

安装命令: pip install python-docx

from docx import Document


d = Document('标题.docx')


for p in d.paragraphs: # 获取每个段落
    # 获取numId
    print('numId', p._element.pPr.numPr.numId.val, end='  ')
    # 获取ilvl的值,注意纯文本段落没有ilvl,其ilvl是None
    try:
        print('ilvl', p._element.pPr.numPr.ilvl.val, end='  ')
    except AttributeError:
        print('ilvl', p._element.pPr.numPr.ilvl, end='  ')
    # 获取每个段落的文本信息
    print('text', p.text)

# 获取numbering.xml文件中的信息
ct_numbering = d.part.numbering_part._element
numXML = d.part.numbering_part.numbering_definitions._numbering

for num in ct_numbering.num_lst:
    # 获取numId和abstractNmuId的对应关系
    print('numId:', num.numId, end='  ')
    print('abstractId:', num.abstractNumId.val)

for i in numXML.abstractNum_lst:
    # 获取每个abstractNumId里面的每个ilvl里的lvlText,numFmt,start
    for j in i.lvl_lst:
        print('lvlText:', j.lvlText_lst[0].val, end='  ')
        print('start:', j.start_lst[0].val, end='  ')
        print('numFmt:', j.numFmt_lst[0].val)

word内容

?代码运行结果:

3.尚未解决的问题

(1)、单级编号的顺序没办法直接确定

????????同一个标号的不同顺序的numId相同,ilvl值相同。如一、......二、......,其中段落一、......和段落二、......的numId和ilvl值相同,意味着abstractNumId、start、numFmt、lvlText都相同。所以如何解决标号的顺序,目前我没有发现可以直接获取到顺序的方法。

? ? ? ? 但是可以通过计算相同numId的出现次数来确定顺序。

(2)、多级编号的顺序没办法直接确定,计数的也行不通

????????“1.,1.1,1.2,2.,2.1,2.2”这类的多级编号,这几个段落的numId全部相同,其中1.,2.的ilvl值相同,1.1,1.2,2.1,2.2的ilvl值相同。

对于这两个问题请能够解决的大佬给予指导。

????????

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-12-04 13:24:12  更:2021-12-04 13:26:01 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 2:32:48-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码