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

前言

在日常工作中,我们经常需要处理大量的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_text
                else:
                    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)] = 1
                        merged_cells[(i, j)] = cell_text
                    elif v_merge[0] is None:
                        row_spans[(i, j)] += 1
                        row_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格式,从而方便进一步的数据分析或导入到数据库中。节省了手动数据录入的时间,还减少了人为错误的可能性,提高了数据处理的效率和准确性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值