Python 实现Word文档中提取表格数据并转换为CSV和JSON格式

python实现Word文档中提取表格数据

  • 前言
    • 1.解析Word文档中的表格
    • 2.保存表格数据
    • 3.处理文件夹中的多个Word文档
    • 4.总结

前言

在日常工作中,我们经常需要处理大量的Word文档,其中包含各种表格数据。手动整理这些表格不仅耗时且容易出错。因此,开发一个自动化工具来解析Word文档中的表格,并将其转换为更易于处理的CSV或JSON格式,可以极大地提高工作效率。

1.解析Word文档中的表格

Python提供了多个库来帮助我们实现这一目标,其中python-docx库非常适合读取Word文档(.docx)的内容。下面的代码示例展示了一个名为extract_tables_from_docx的函数,该函数接收一个Word文档的路径作为输入,然后解析文档中的所有表格,并将每个表格的数据以嵌套列表的形式返回。

首先导入必要的库

import os
import csv
import json
from docx import Document
from collections import defaultdict
from lxml import etree
def extract_tables_from_docx(docx_path):doc = Document(docx_path)all_tables_data = []for table in doc.tables:table_data = []merged_cells = defaultdict(str)row_spans = defaultdict(lambda: 0)for i, row in enumerate(table.rows):row_data = []for j, cell in enumerate(row.cells):cell_text = cell.text.strip()cell_xml = etree.fromstring(cell._element.xml)nsmap = {'w': 'http://schemas.openxmlformats.org/wordprocessingml/2006/main'}grid_span = cell_xml.xpath(".//w:gridSpan/@w:val", namespaces=nsmap)if grid_span:span = int(grid_span[0])for k in range(span):if k == 0:row_data.append(cell_text)else:merged_cells[(i, j + k)] = cell_textelse:row_data.append(cell_text)v_merge = cell_xml.xpath(".//w:vMerge/@w:val", namespaces=nsmap)if v_merge:if v_merge[0] == 'restart':row_spans[(i, j)] = 1merged_cells[(i, j)] = cell_textelif v_merge[0] is None:row_spans[(i, j)] += 1row_data[-1] = merged_cells[(i - row_spans[(i, j)], j)]table_data.append(row_data)all_tables_data.append(table_data)return all_tables_data

该函数使用了lxml库来解析XML,因为.docx文件本质上是ZIP压缩包,其中包含了用于描述文档结构的XML文件。lxml库允许通过XPath查询来访问这些XML元素,从而处理单元格的合并和跨度。

2.保存表格数据

一旦表格数据被提取出来,就可以将其保存为CSV或JSON格式。为此,定义了两个辅助函数save_tables_to_csv和save_tables_to_json,它们分别负责将表格数据写入CSV文件和JSON文件。


def save_tables_to_csv(tables, output_dir, file_name):for i, table in enumerate(tables):csv_path = os.path.join(output_dir, f"{file_name}_table_{i+1}.csv")with open(csv_path, mode='w', newline='', encoding='utf-8') as file:writer = csv.writer(file)writer.writerows(table)print(f"表格 {i+1} 已保存为 CSV 文件,路径为 {csv_path}")def save_tables_to_json(tables, output_dir, file_name):for i, table in enumerate(tables):json_path = os.path.join(output_dir, f"{file_name}_table_{i+1}.json")with open(json_path, mode='w', encoding='utf-8') as file:json.dump(table, file, ensure_ascii=False, indent=4)print(f"表格 {i+1} 已保存为 JSON 文件,路径为 {json_path}")

3.处理文件夹中的多个Word文档

为了批量处理文件夹中的多个Word文档,我们可以使用os.listdir和列表推导式来获取所有.doc或.docx文件的列表。然后,对于列表中的每个文件,我们调用上述函数来提取表格并保存结果。

# 设置文件路径和输出目录
docx_path = r'E:\data\\测试表格'
output_dir = r'E:\data\\测试表格'# 获取文件夹中所有 Word 文件的列表
word_files = [f for f in os.listdir(docx_path) if f.endswith('.doc') or f.endswith('.docx')]# 提取表格数据并保存为 CSV 和 JSON 文件
for file in word_files:file_path = os.path.join(docx_path, file)tables = extract_tables_from_docx(file_path)file_name = os.path.splitext(file)[0]save_tables_to_csv(tables, output_dir, file_name)save_tables_to_json(tables, output_dir, file_name)

4.总结

通过这个脚本,可以轻松地从Word文档中提取表格数据,并将其转换为CSV或JSON格式,从而方便进一步的数据分析或导入到数据库中。节省了手动数据录入的时间,还减少了人为错误的可能性,提高了数据处理的效率和准确性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/44861.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何分析软件测试中发现的Bug!

假如你是一名软件测试工程师,每天面对的就是那些“刁钻”的Bug,它们像是隐藏在黑暗中的敌人,时不时跳出来给你一个“惊喜”。那么,如何才能有效地分析和处理这些Bug,让你的测试工作变得高效且有趣呢?今天我…

MongoDB - 集合和文档的增删改查操作

文章目录 1. MongoDB 运行命令2. MongoDB CRUD操作1. 新增文档1. 新增单个文档 insertOne2. 批量新增文档 insertMany 2. 查询文档1. 查询所有文档2. 指定相等条件3. 使用查询操作符指定条件4. 指定逻辑操作符 (AND / OR) 3. 更新文档1. 更新操作符语法2. 更新单个文档 updateO…

【ElasticSearch】ES 5.6.15 向量插件支持

参考 : https://github.com/lior-k/fast-elasticsearch-vector-scoring 下载插件 安装插件 插件目录: elasticsearch/plugins, 安装后的目录如下 plugins└── vector├── elasticsearch-binary-vector-scoring-5.6.9.jar└── plugin-descriptor.properties修…

linux中如何开启多个mysql进城并且单独设置密码和端口

在 Linux 系统中,默认情况下 MySQL(或 MariaDB,一个流行的 MySQL 分支)不直接支持在同一台机器上运行多个 MySQL 实例,每个实例使用不同的端口和独立的密码系统。但是,你可以通过配置多个 MySQL 实例&#…

web安全及内网安全知识

本文来源无问社区(wwlib.cn)更多详细内容可前往观看http://www.wwlib.cn/index.php/artread/artid/7506.html Web安全 1、sql注入 Web程序中对于用户提交的参数未做过滤直接拼接到SQL语句中执行,导致参数中的特殊字符破坏了SQL语句原有逻…

简述多云互联原理,客户公私云池互通的产品是什么?

多云互联原理基于企业或组织使用多个不同的云服务提供商的基础设施和服务,以实现最佳的运营效率、弹性和成本效益。这种策略允许用户避免供应商锁定,分散风险,并利用不同云服务商的特定优势,例如价格、地理位置、功能或性能。 多云…

jvm 07 GC算法,内存池,对象内存分配

01 垃圾判断算法 1.1引用计数算法 最简单的垃圾判断算法。在对象中添加一个属性用于标记对象被引用的次数,每多一个其他对象引用,计数1, 当引用失效时,计数-1,如果计数0,表示没有其他对象引用,…

【LeetCode】字母异位词分组

目录 一、题目二、解法完整代码 一、题目 给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入: strs [“eat”, “tea”, “tan”, “ate”, “nat”, …

51单片机-第一节-LED和独立按键

一、点亮LED&#xff1a; 首先包含头文件 <REGX52.H> 随后令P2为0xFE。(此时二进制对应1111 1110&#xff0c;为0 的LED亮&#xff0c;故八个灯中的最后一个亮起)。 注&#xff1a;P2为控制LED的8位寄存器。 void main() {P2 0xFE;//1111 1110while(1){} } 二、L…

递归 汉诺塔-java

汉诺塔传说&#xff1a; 汉诺塔&#xff08;又称河内塔&#xff09;问题是源于印度一个古老传说的益智玩具。 大梵天创造世界的时候做了三根金刚石柱子&#xff0c;在一个柱子从下往上按照大小顺序摞着64片圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱…

跨境电商自养号测评干货分享:从环境搭建到安全养号

跨境电商测评&#xff08;补单&#xff09; 测评补单这个词对于大部分跨境卖家来说都很熟悉&#xff0c;因为补单对于卖家来说算是一种低成本&#xff0c;高回报的推广营销方式&#xff0c;对于商品流量&#xff0c;转化率&#xff0c;关键词质量分&#xff0c;链接权重都起到…

ACL 2024 Accepted Paper 浅浅分析

7月7日&#xff0c;晴。 ACL 2024的接受论文列表终于姗姗来迟&#xff0c;全网没有搜到相关解析&#xff0c;那我只能先吃个螃蟹了。 借助ChatGPT的辅助编程&#xff0c;我对于其论文和作者进行了一些浅浅的分析&#xff0c;主要从词云、主题类型、作者发表数量3个方面对于主…

Node.js如何在Windows安装?

文章目录 主要特点&#xff1a;使用场景&#xff1a;安装方法验证是否安装成功 Node.js 是一个开源、跨平台的JavaScript运行环境&#xff0c;由Ryan Dahl于2009年创建。它允许开发者在服务器端运行JavaScript代码。Node.js 基于Chrome V8 JavaScript引擎构建&#xff0c;其设计…

CTF php RCE(三)

0x07 日志文件包含 判断类型 使用kali curl -I urlF12 打开F12开发者工具&#xff0c;选中之后F5刷新查看server类型即可 配置文件 直接包含或者访问如果有回显就是&#xff0c; NGINX&#xff1a;NGINX 的配置文件通常位于 /etc/nginx/ 目录下&#xff0c;具体的网站配…

【Lua】lua实现C# continue效果

1. repeat…until和break for i 1, 5 dorepeatif i 3 thenbreakendprint(i)until true end--[[1245 ]]2. 使用goto for i 1, 5 doif i 3 thengoto continueendprint(i, " no continue")::continue:: end--[[1 no continue3 no continue4 no continue5 no c…

2024.7.10作业

完成学生管理系统 1> 使用菜单完成 2> 有学生的信息录入功能&#xff1a;输入学生个数&#xff0c;并将学生的姓名、分数录入 3> 查看学生信息&#xff1a;输出所有学生姓名以及对应的分数 4> 求出学习最好的学生信息&#xff1a;求最大值 5> 按姓名将所有…

北斗GPS天线使用技巧与性能对比

北斗GPS天线使用中注意的问题 多系统兼容性&#xff1a;确保天线不仅能接收北斗信号&#xff0c;还能同时接收其他GNSS系统&#xff08;如GPS、GLONASS、Galileo&#xff09;的信号&#xff0c;以提高定位精度和可靠性。 信号频率选择&#xff1a;根据应用需求选择合适的信号…

各数据库查询模式名、表名、表注释、表大小

一、Oracle SELECT * FROM (SELECT t.*, ROWNUM rn FROM (SELECT a.owner AS schema_name, a.table_name, b.comments as table_comment, COALESCE(a.blocks, 0) * 8 / 1024 AS size_kb FROM dba_tables a left join dba_tab_comments b on a.table_name b.table_name and a.…

[Python学习篇] Python异常

什么是异常&#xff1f; 异常&#xff08;Exception&#xff09;是指在程序执行过程中发生的错误事件&#xff0c;它会中断程序的正常执行流程。异常可以由程序中的错误引发&#xff0c;也可以通过主动抛出异常来处理特殊情况。Python 使用异常处理机制来捕获和处理这些错误&am…

《警世贤文》摘抄:处人篇、受恩篇、宽人篇、听劝篇、劝善篇(多读书、多看报、少吃零食多睡觉)

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/140343740 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…