当前位置:   article > 正文

python docx 读取自动编号_word 自动编号python转换

word 自动编号python转换

最近需要用python读取docx文档,然后遇到python-docx无法读取到自动编号的问题,例如我们要读取的docx文档:
这是一个简单的docx文档示例,simple.docx
接下来我们读取文档的文本内容:

from docx import Document

doc = Document('simple.docx')

for para in doc.paragraphs:
    text = para.text
    print(text)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

运行结果:

 这是一个示例docx文档
 下面是自动编号
 
 csdn
 作者:JoanSF
 性别:男
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

可以看到结果没有打印出来自动编号,在网上查阅了很久都没有找到一个很好的解决办法,最终靠着摸索出了一个比较有效的方法,仅供大家参考,如果不对的地方,欢迎大家提出意见。

python-docx只能找到自动编号的位置,而无法找到对应正确的序号

网上还是存在一些相关文章说明python-docx库能够找到自动编号的位置,但是不能找到对应编号的序号,否则大家只能一般默认是序号为1开始,但是我遇到的情况恰恰是序号不是从1开始的文档,所以光是找到自动编号的位置不行,还需要找到对应正确的序号。

docx文档竟然是压缩包

由于docx是压缩包,我们把simple.docx的后缀名改成zip,然后解压,然后我们就可以直接观察到docx的组成了
在这里插入图片描述
在word文件夹下有很多xml文件,其中的numbering.xml文件就是用来记录自动编号的信息,观察numbering.xml文件就可以发现 start 这里代表了自动编号的起始序号(这个例子不明显,但是小编的实际情况的序号是从68开始的,所以很快就发现了)
在这里插入图片描述
到现在,知道了自动编号的位置和自动编号的起始序号,这样我们就可以打印自动编号了

from docx import Document
import zipfile
from bs4 import BeautifulSoup

doc = Document('simple.docx')

document = zipfile.ZipFile('simple.docx')
xml_data = document.read('word/numbering.xml')
document.close()
soup = BeautifulSoup(xml_data,'xml')
string = str(soup.find('start'))
# 得到自动编号的起始序号
ind = int(eval(string.split('w:val=')[-1].split('/')[0]))

for para in doc.paragraphs:
    text = para.text
    num_pr = para._p.pPr.numPr
    if num_pr is not None: # 判断是否有自动编号
        print('{}) '.format(ind)+text)
        ind += 1
    else:
        print(text)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

运行结果:

这是一个示例docx文档
下面是自动编号

1) csdn
2) 作者:JoanSF
3) 性别:男
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

虽然例子简单,但是花费小编(菜鸡一枚)辛苦一天,而且复杂点的自动编号也可以根据这个思路改,看完的各位大佬记得点赞

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/795977
推荐阅读
相关标签
  

闽ICP备14008679号