python docx从段落中获取表格
我有.docx文件,其中包含许多段落和表格,如:python docx从段落中获取表格,python,document,docx,paragraphs,Python,Document,Docx,Paragraphs,我有.docx文件,其中包含许多段落和表格,如: 帕尔1 表1 表2 表3 帕尔2 表1 表2 2.1第21段 表1 表2 我需要迭代所有对象并生成字典,可能是json格式,如: {par1: [table1, table2, table3], par2[table1,table2, {par21: [table1,table2]} ] } {par1:[表1,表2,表3],par2[表1,表2,{par21:[表1,表2]}] 从docx.api导入文档 文件名='test.doc
- 表1
- 表2
- 表3
- 表1
- 表2
- 表1
- 表2
您能提出一些建议吗?在python docx库上还没有实现这种方法,但有一种变通方法可以按照docx中所有元素的显示顺序进行迭代: 您可以尝试遍历所有这些,检查对象是否是表或段落的实例,并以此为基础进行逻辑分析。
来自docx导入文档
from docx import Document
from docx.document import Document as _Document
from docx.oxml.text.paragraph import CT_P
from docx.oxml.table import CT_Tbl
from docx.table import _Cell, Table
from docx.text.paragraph import Paragraph
def iter_block_items(parent):
"""
Generate a reference to each paragraph and table child within *parent*,
in document order. Each returned value is an instance of either Table or
Paragraph. *parent* would most commonly be a reference to a main
Document object, but also works for a _Cell object, which itself can
contain paragraphs and tables.
"""
if isinstance(parent, _Document):
parent_elm = parent.element.body
elif isinstance(parent, _Cell):
parent_elm = parent._tc
elif isinstance(parent, _Row):
parent_elm = parent._tr
else:
raise ValueError("something's not right")
for child in parent_elm.iterchildren():
if isinstance(child, CT_P):
yield Paragraph(child, parent)
elif isinstance(child, CT_Tbl):
yield Table(child, parent)
document = Document('test.docx')
for block in iter_block_items(document):
#print(block.text if isinstance(block, Paragraph) else '<table>')
if isinstance(block, Paragraph):
print(block.text)
elif isinstance(block, Table):
for row in block.rows:
row_data = []
for cell in row.cells:
for paragraph in cell.paragraphs:
row_data.append(paragraph.text)
print("\t".join(row_data))
从docx.document导入文档作为_文档
从docx.oxml.text.paragration导入CT\u P
从docx.oxml.table导入CT\u Tbl
从docx.table导入\u单元格,表格
从docx.text.paragration导入段落
定义iter_块_项目(父项):
"""
生成对*parent*中每个段落和表格子级的引用,
按文档顺序。每个返回值都是表或
第.*段“父项”通常是对主项的引用
Document对象,但也适用于_Cell对象,它本身可以
包含段落和表格。
"""
如果是实例(父文档):
parent_elm=parent.element.body
elif isinstance(父单元格):
父对象=父对象
elif isinstance(父行):
父对象=父对象。\u tr
其他:
raise VALUE ERROR(“某些错误”)
对于父对象\ elm.iterchildren()中的子对象:
如果存在(子项,CT\P):
产生段落(子段、父段)
elif isinstance(儿童,CT_Tbl):
收益表(子、父)
文档=文档('test.docx')
对于iter\U block\U项目中的block(文件):
#打印(如果是实例(块,段落),则为block.text,否则为“”)
如果存在(块,段落):
打印(块文本)
elif isinstance(块、表):
对于block.rows中的行:
行_数据=[]
对于row.cells中的单元格:
对于单元格中的段落。段落:
行数据追加(段落文本)
打印(“\t”.join(行数据))
不确定我是否在帮忙,但以下是我的做法
def printTables(doc):
for table in doc.tables:
for row in table.rows:
for cell in row.cells:
for paragraph in cell.paragraphs:
print(paragraph.text)
printTables(cell)
我试过了,并不是所有的文本都显示出来,只有列名出现,这就是它应该呈现的吗?这是不是docx在我的系统上无法正确打开?我想了解更多关于此代码的信息,以及如何解决我的问题。您是否可以知道,是否可以重构此函数并找到InlineShapes?我想引导未来读者了解此问题,因为这是API@ImaneE. 可能太晚了,但您的问题可能与打印表头有关。建议:您可以尝试将段落文本打印到列表中,并删除最有可能是表头的第一个元素?如果你能启动并运行它,请分享!
def printTables(doc):
for table in doc.tables:
for row in table.rows:
for cell in row.cells:
for paragraph in cell.paragraphs:
print(paragraph.text)
printTables(cell)