Python實現(xiàn)Word文檔中提取表格數(shù)據(jù)并轉(zhuǎn)換為CSV和JSON格式
前言
在日常工作中,我們經(jīng)常需要處理大量的Word文檔,其中包含各種表格數(shù)據(jù)。手動整理這些表格不僅耗時且容易出錯。因此,開發(fā)一個自動化工具來解析Word文檔中的表格,并將其轉(zhuǎn)換為更易于處理的CSV或JSON格式,可以極大地提高工作效率。
1.解析Word文檔中的表格
Python提供了多個庫來幫助我們實現(xiàn)這一目標(biāo),其中python-docx庫非常適合讀取Word文檔(.docx)的內(nèi)容。下面的代碼示例展示了一個名為extract_tables_from_docx的函數(shù),該函數(shù)接收一個Word文檔的路徑作為輸入,然后解析文檔中的所有表格,并將每個表格的數(shù)據(jù)以嵌套列表的形式返回。
首先導(dǎo)入必要的庫
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
該函數(shù)使用了lxml庫來解析XML,因為.docx文件本質(zhì)上是ZIP壓縮包,其中包含了用于描述文檔結(jié)構(gòu)的XML文件。lxml庫允許通過XPath查詢來訪問這些XML元素,從而處理單元格的合并和跨度。
2.保存表格數(shù)據(jù)
一旦表格數(shù)據(jù)被提取出來,就可以將其保存為CSV或JSON格式。為此,定義了兩個輔助函數(shù)save_tables_to_csv和save_tables_to_json,它們分別負(fù)責(zé)將表格數(shù)據(jù)寫入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和列表推導(dǎo)式來獲取所有.doc或.docx文件的列表。然后,對于列表中的每個文件,我們調(diào)用上述函數(shù)來提取表格并保存結(jié)果。
# 設(shè)置文件路徑和輸出目錄
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')]
# 提取表格數(shù)據(jù)并保存為 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.總結(jié)
通過這個腳本,可以輕松地從Word文檔中提取表格數(shù)據(jù),并將其轉(zhuǎn)換為CSV或JSON格式,從而方便進(jìn)一步的數(shù)據(jù)分析或?qū)氲綌?shù)據(jù)庫中。節(jié)省了手動數(shù)據(jù)錄入的時間,還減少了人為錯誤的可能性,提高了數(shù)據(jù)處理的效率和準(zhǔn)確性。
以上就是Python實現(xiàn)Word文檔中提取表格數(shù)據(jù)并轉(zhuǎn)換為CSV和JSON格式的詳細(xì)內(nèi)容,更多關(guān)于Python Word數(shù)據(jù)提取并轉(zhuǎn)為CSV和JSON的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python?matplotlib自定義colorbar顏色條及內(nèi)置色條詳解
由于自己畫圖的需要想要用一些自定義的顏色來做一個colorbar,所以下面這篇文章主要給大家介紹了關(guān)于python?matplotlib自定義colorbar顏色條及內(nèi)置色條的相關(guān)資料,需要的朋友可以參考下2022-08-08
python爬蟲Mitmproxy安裝使用學(xué)習(xí)筆記
這篇文章主要介紹了python爬蟲Mitmproxy學(xué)習(xí)筆記分享,有需要的朋友可以收藏學(xué)習(xí)下,希望可以對你有所幫助,大家一起共同學(xué)習(xí),共同進(jìn)步2021-09-09
python中tkinter實現(xiàn)GUI程序三個實例教程
Python提供了多個GUI庫,使開發(fā)人員能夠輕松創(chuàng)建各種交互式界面,這篇文章主要給大家介紹了關(guān)于python中tkinter實現(xiàn)GUI程序的三個實例教程,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-05-05

