python读取json数据还原表格批量转换成html
作者:kuokay 发布时间:2023-11-19 05:46:20
背景:
由于需要对ocr
识别系统的表格识别结果做验证,通过返回的json
文件结果对比比较麻烦,故需要将json
文件里面的识别结果还原为表格做验证。
文件部分内容如下:
{"row":"6","col","5""start_row": 0, "start_column": 0, "end_row": 0, "end_column": 0, "data": "称", "position": [51, 71, 168, 93], "org_position": [50, 60, 167, 62, 166, 84, 49, 82], "char_position": [[86, 83, 100, 100]], "lines": [{"text": "称", "poly": [84, 73, 98, 73, 98, 90, 84, 90, 0.874], "score": 0.874, "char_centers": [[91, 82]], "char_polygons": [[84, 77, 98, 74, 98, 87, 84, 90]], "char_candidates": [["称"]], "char_candidates_score": [[0.999]], "char_scores": [0.999]}]}
现在需要通过行列的起始和结束坐标以及内容生成相应的表格
开始准备使用js但由于一些语法忘记,所以还是选用python进行。
在经过一些列研究后发现利用python-docx
可自动生成表格,但是格式是word的,所有后期又进行了word转html操作。
一、实操
pip install python_docx
1.首先创建一个新的文档
from docx import Document
document = Document()
然后用Document
类的add_table
方法增加一个表格,其中rows是行,cols是列,style表格样式,具体可以查看官方文档:
table = document.add_table(rows=37,cols=13,style='Table Grid')
上述代码就在word里插入了一个37行、13列的表格。(有37*13=481个cell)
生成的每个cell都是有“坐标”的,比如上面的表格左上角cell为(0,0),右下角cell为(36,12)
下面要做的就是合并一些cell,从而达到我们最终需要的表格
table.cell(0,0).merge(table.cell(2,2))
上述代码就将cell(0,0)到cell(2,2)之间的所有cell合并成一个cell
这里需要注意的是,虽然每个cell都合并了,但其实它还是存在的。比如合并了(0,0)和(0,1)两个cell,那么这个合并的cell其实就是(0,0;0,1)
如果cell较多,无法直观的看出坐标的话,可以用下列的代码将每个cell的坐标都标注出来,方便合并
document = Document()
table = document.add_table(rows=37,cols=13,style='Table Grid')
document.save('table-1.docx')
document1 = Document('table-1.docx')
table = document1.tables[0]
for row,obj_row in enumerate(table.rows):
for col,cell in enumerate(obj_row.cells):
cell.text = cell.text + "%d,%d " % (row,col)
document1.save('table-2.docx')
2.添加文本
将所有cell依次合并后,就需要向合并后的cell
里添加文本。
用table的row方法可以得到一个表格的一行list其中包含了这一行的所有cell
hdr_cells0 = table.rows[0].cells
上面代码就得到了合并表格后的第一行所有cell,然后我们用hdr_cell0[0]就可以得到合并表格后的第一行的第一个cell。用add_paragraph
方法即可像cell里添加文本
hdr_cells0[0].add_paragraph('数据文字')
其他使用方法可参考官网模块:https://www.osgeo.cn/python-docx/
二、word转成html
1.使用pydocx转换
pip install pydocx
from pydocx import PyDocX
html = PyDocX.to_html("test.docx")
f = open("test.html", 'w', encoding="utf-8")
f.write(html)
f.close()
通过网页上传word文档,只接收docx
<form method="post" enctype="multipart/form-data">
<input type="file" name="file" accept="application/vnd.openxmlformats-officedocument.wordprocessingml.document">
</form>
2.使用win32模块
pip3 install pypiwin32
from win32com import client as wc
import os
word = wc.Dispatch('Word.Application')
def wordsToHtml(dir):
for path, subdirs, files in os.walk(dir):
for wordFile in files:
wordFullName = os.path.join(path, wordFile)
doc = word.Documents.Open(wordFullName)
wordFile2 = wordFile
dotIndex = wordFile2.rfind(".")
if (dotIndex == -1):
print(wordFullName + "********************ERROR: 未取得后缀名!")
fileSuffix = wordFile2[(dotIndex + 1):]
if (fileSuffix == "doc" or fileSuffix == "docx"):
fileName = wordFile2[: dotIndex]
htmlName = fileName + ".html"
htmlFullName = os.path.join(path, htmlName)
print("generate html:" + htmlFullName)
doc.SaveAs(htmlFullName, 10)
doc.Close()
word.Quit()
print("")
print("Finished!")
if __name__ == '__main__':
import sys
if len(sys.argv) != 2:
print("Usage: python funcName.py rootdir")
sys.exit(100)
wordsToHtml(sys.argv[1])
来源:https://blog.csdn.net/qq_45066628/article/details/123246744


猜你喜欢
- 用Python + PyQT写的一个系统桌面时钟,刚学习Python,写的比较简陋,但是基本的功能还可以。功能:①窗体在应用程序最上层,不用
- 一般来说,内置的slice()函数会创建一个切片对象,可以用在任何允许进行切片操作的地方。下面是slice的简介:# slice 两种用法c
- Pycharm代码运行调试,具体内容如下1、准备工作(1)Python版本为2.7或者更高版本(2)已经创建了一个Python工程并且添加了
- 我们常常看到一个这样的表达式 A=lambda x:x+1可能会一头雾水不知道怎么计算 最基本的理解就是def A(x):retu
- Pandas是Python中非常常用的数据处理工具,使用起来非常方便。它建立在NumPy数组结构之上,所以它的很多操作通过NumPy或者Pa
- 最近需要用Python写一个简易通讯录,但是对于数据存储很发愁。大家都知道,使用 Python 中的列表和字典进行存储数据是很不靠谱的,所以
- 要将xian80地理坐标系转换成投影坐标系:xian1980 = """GEOGCS["GCS_Xi
- 发现一个有意思的现象,labelimg打开图片和xml标签时候,看不到标注好的框框,仔细查看了xml文件,没发现什么异常,后面试一下,才发现
- 前言:stored procedure 完成特定功能的SQL语句集,存储在数据库中,经过第一次编译之后再次调用不需要编译(效率较高)1、存储
- 安装cesium在已有项目中执行,npm i cesium修改配置build/webpack.base.conf.js1、定义 Cesium
- 今天彬Go将和大家一起讨论网页设计趋势中很重要的环节,那就是”勾引”用户的按钮。所谓”勾引”用户的按钮,其实对于Web设计师来说,就是如何设
- 简单的说,GUI编程就是给程序加上图形化界面.python的脚本开发简单,有时候只需几行代码就能实现丰富的功能,而且python本身是跨平台
- BS架构的企业级应用中,当一个表格列数较多时,用户一个常见的需求就是把前面几个重要的列固定住,这样拖动滚动条时固定的列会方便用户查看数据,用
- 项目中需要根据不同业务进行分库,首先是将业务不同业务映射到不同过的数据库( biz --> db,可能存在多对一情况),查看sprin
- 代码如下:<% '=================================================
- 用到的 Pygame 函数贪吃蛇小游戏用到的函数 功能描述init()初始化 pygamedisplay.set_mode()以元
- 数据库中最好插入Null值。在python中,暂时没找到通过sql语句的方式插入Null值。推荐使用轮子的方法def insert_samp
- 先上效果,视频敬上:字符舞:代码舞源代码:video_2_code_video.pyimport argparseimport osimpo
- 一、隔离级别的概念为什么要考虑隔离级别?因为事务要并发执行,而并发执行可能会出现一些问题:脏读、不可重复读和虚读,有的是允许出现的,有的不允
- 前言:今天在优化工作中遇到的sql慢的问题,发现以前用了挺多游标来处理数据,这样就导致在数据量多的情况下,需要一行一行去遍历从而计算需要的数