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格式,从而方便进一步的数据分析或导入到数据库中。节省了手动数据录入的时间,还减少了人为错误的可能性,提高了数据处理的效率和准确性。