网上清除空行的资料居然不多,出乎意料。不过好在找到一个答案:
def _delBlankLine( file):
'''
清除word文档的空行
:param file: 文档
'''
doc = Document(file)
for paragraph in doc.paragraphs: # 读取文档段落
if len(paragraph.text) == 0:
p = paragraph._element
p.getparent().remove(p)
p._p = p._element = None
doc.save(file)
但是上面代码有问题,就是仅有图片的行也会被清除,因为图片也没有文字。
我很意外的是Python这么强大的工具居然没有判断图片的能力。。
所以我只能自己研究:
我发现,如果真的是普通的空行,他的len(paragraph.runs)==0。而有图片的行len(paragraph.runs)>=1。
然而实际情况比这更复杂:
有些肉眼看上去是空行的,他text可能是‘\n’
也有的text为空,但是paragraph.runs不为空。但是len(paragraph.runs)也会有限,目前只发现==1的情况,还没有发现==2的。
所以,这里提供一种思路,但不完全适用所有的场景。可以自己去debug比较,到底有哪些变量可以作为判断的依据:
def _delBlankLine( file):
'''
清除word文档的空行
:param file: 文档
'''
doc = Document(file)
for paragraph in doc.paragraphs: # 读取文档段落
if len(paragraph.text) == 0 and len(paragraph.runs) <= 1:
p = paragraph._element
p.getparent().remove(p)
p._p = p._element = None
doc.save(file)
我这个就根据特点,有图片的行至少有两张图片一起。所以我的len(paragraph.runs) >= 2。所以以上就可以解决我的问题。
还可以看看这篇文章对docx的解析:docx的解析