章节编号可以清晰的了解文档结构。Word 软件可以使用自动编号的功能, 但是使用起来需要专门学习一下,而且经常会出现问题,如果对 Word 软件, 以及标题、样式等概念不是很熟悉,遇到问题有时也很难解决。所以, 大部分用户实际使用的时候都是手工编号,而手工编号的问题在于修改, 尤其是前面章节调整时,会导致需要重新编号,非常地繁琐。
from docx import Document
document = Document('/data/demo/demo1.docx')
为了添加序号,需要先看一下要对哪些命名样式进行添加:
for p in document.paragraphs:
name= p.style.name
print(name, )
Title Normal Normal Normal Heading 1 Heading 2 Normal 我的自定义样式 Normal Normal
根据样式获取标题,这里都是默认的样式名称。
head1=0
head2=0
head3=0
for para in document.paragraphs:
style_name= para.style.name
if style_name=="Heading 1":
head1+=1
for i in range(len(para.runs)):
para.runs[i].text = para.runs[i].text.replace(
para.text, str(head1)+" "+para.text
)
head2=0
head3=0
if style_name=="Heading 2":
head2+=1
for i in range(len(para.runs)):
para.runs[i].text = para.runs[i].text.replace(
para.text, str(head1)+"."+str(head2)+" "+para.text
)
if style_name=="Heading 3":
head3+=1
for i in range(len(para.runs)):
para.runs[i].text = para.runs[i].text.replace(
para.text,
str(head1)+"."+str(head2)+"."+str(head3)+" "+para.text
)
将文件另存为一个新文件。
document.save('xx_numbered.docx')
document1 = Document('xx_numbered.docx')
for para1 in document1.paragraphs[:6]:
name= para1.style.name
if name.startswith('Heading'):
print(' ' * int(name.split()[-1]) * 2, para1.text, '(', name, ')')
1 这是一个默认标题 ( Heading 1 ) 1.1 这是一个二级标题 ( Heading 2 )
使用这种方法可以简化手动添加的时间,优化可读性。 对于已经添加了序号的文档,在修改过程中会面临重新编号的问题。 对于这个问题,可以用字符串处理的技术,如正则表达式得到标题的文字, 从而在重新编号过程中忽略掉原来的编号。
还有一个问题,如果要进行重新编号,则需要将原来的编号去掉。 去掉编号的过程就是字符串处理的功能,可以使用正则表达式模块。