python-docx 遍历文档
- 遍历段落和表格(顶级)
- 获取段落中的图片
- 参考资料
遍历段落和表格(顶级)
只有业务场景中需要严格按照word文档中段落和表格的顺序遍历时才使用这个方案。
否则直接遍历下面这几个更方便:
段落:doc.paragraphs
表格:doc.tables
图片:doc.inline_shapes
# 导入必要的库
from docx import Document
from docx.oxml.table import CT_Tbl
from docx.oxml.text.paragraph import CT_P
from docx.table import Table
from docx.text.paragraph import Paragraph# 遍历文档中的所有【段落】和【表格】
def get_ele(ele, body):# 如果是表格对象if type(ele) == CT_Tbl:# 创建表格对象table_obj = Table(ele, body)# 打印表格信息,包括行数和列数print(f"表格 | {table_obj}: {len(table_obj.rows)} 行, {len(table_obj.columns)} 列")# 遍历表格中的所有行for row in table_obj.rows:# 打印行的内容,处理合并单元格的情况print(f"单行 | ", " | ".join([c.text.replace('\n', '') + f"{' ' * c.grid_span}" for c in list(set(row.cells))]), "|")# 如果是段落对象elif type(ele) == CT_P:# 创建段落对象paragraph_obj = Paragraph(ele, body)# 打印段落文本print(f"段落 | ", paragraph_obj.text)# 遍历文档中的所有【节】
def show_section(doc):# 获取文档的主体部分body = doc.element.body# 遍历文档中的所有节for section in doc.sections:# 打印节的类型print("节节 | ", str(section.start_type))# 遍历节中的所有子元素for ele in section.part.element.body.iterchildren():get_ele(ele, body)# 定义一个函数用于展示文档内容
def show_ele(doc):# 获取文档的主体部分body = doc.element.body# 遍历文档中的所有元素for ele in body.iterchildren():get_ele(ele, body)# 定义文档路径
file_path = r"D:\Work\\test.docx"
# 加载文档
doc = Document(file_path)
# 显示文档内容
show_ele(doc)
# show_section(doc)
获取段落中的图片
# 获取段落中的图片对象
def get_picture_list(paragraph):if isinstance(paragraph, Paragraph):ct_p = paragraph._prelated_parts = paragraph.part.related_partspic_path = "./w:r/w:drawing/*[self::wp:inline | self::wp:anchor]/a:graphic/a:graphicData/pic:pic/pic:blipFill/a:blip"return [related_parts.get(b.embed).image for b in ct_p.xpath(pic_path) if b.embed]return []# 获取一组段落中的图片对象
def get_picture_list_4_paragraphs(paragraphs):picture_list = []for paragraph in paragraphs:temp_list = get_picture_list(paragraph)if len(temp_list) > 0:picture_list.extend(temp_list)return picture_list# 显示图片信息
def show_picture(doc):# 获取文档中的所有段落中的图片对象picture_list = []picture_list.extend(get_picture_list_4_paragraphs(doc.paragraphs))# 遍历所有表格的每一个单元格,取图片对象for table in doc.tables:# 已处理的单元格:解决合并单元格重复读取的问题processed_cells = []for row in table.rows:for cell in row.cells:if cell not in processed_cells:temp_list = get_picture_list_4_paragraphs(cell.paragraphs)if len(temp_list) > 0:picture_list.extend(temp_list)processed_cells.append(cell)result = [(f"格式:{p.ext} | "f"大小:{int(len(p.blob) / 1024)} kb | "f"{p.px_width}x{p.px_height} | "f"vert_dpi:{p.vert_dpi} horz_dpi:{p.horz_dpi} | "f"sha1:{p.sha1}") for p in picture_list]print("\n".join(result))# 定义文档路径
file_path = r"D:\\Work\\test.docx"
# 加载文档
doc = Document(file_path)
# 显示内容
show_picture(doc)
参考资料
Python-docx 文档