Python提取Word表格數(shù)據(jù)的詳細(xì)教程
一、編寫(xiě)目的
最近由于工作上的需要,需要使用Python完成DOC文檔格式數(shù)據(jù)的讀取和修改工作,但通過(guò)查閱相關(guān)資料,直接對(duì)DOC文檔進(jìn)行讀取和修改沒(méi)有相關(guān)的依賴(lài)(主要為doc文件為較早的windows系統(tǒng)支持格式),需要將DOC文件轉(zhuǎn)換為.docx格式,為什么是docx格式?
- ??
.docx
是 XML 格式,通常無(wú)編碼問(wèn)題??,但若從其他格式轉(zhuǎn)換可能出錯(cuò)。 - python-docx依賴(lài)庫(kù)可以直接對(duì)docx文檔格式進(jìn)行操作,但無(wú)法對(duì)doc格式進(jìn)行操作。
那么問(wèn)題就轉(zhuǎn)變?yōu)槿绾螌oc格式轉(zhuǎn)換為.docx格式的問(wèn)題,有下面的解決方法:
- 如果你在windows系統(tǒng)上且安裝有Microsoft Word 可以使用pywin32調(diào)用Word提供的COM口進(jìn)行格式轉(zhuǎn)換。
那如果就不想花錢(qián)或者安裝Word,或者我使用的是其它系統(tǒng)(如Linux系統(tǒng))又該如何轉(zhuǎn)換doc格式到.docx格式呢?
這里也找到了相關(guān)的軟件支持:LibreOffice。它提供了和Word幾乎相同的功能,但其為免費(fèi)開(kāi)源的,并且可以通過(guò)命令行進(jìn)行調(diào)用,最重要的可以多系統(tǒng)支持。
本篇文章就是記錄使用LibreOffice+python-docx完成doc文檔內(nèi)表格的轉(zhuǎn)換和修改的。
二、環(huán)境準(zhǔn)備
1、安裝LibreOffice
如果是Windows系統(tǒng)可以官網(wǎng)下載LibreOffice的.exe安裝包,然后就是不斷地下一步即可。
如果是Linux系統(tǒng)可以通過(guò)下面的命令進(jìn)行安裝:
Ubuntu/Debian??:
sudo apt update && sudo apt install libreoffice
?Fedora??:
sudo dnf install libreoffice
??openSUSE??:
sudo zypper install libreoffice
安裝完成后,可以在命令行中進(jìn)行版本驗(yàn)證:
soffice --version
如果輸出下述內(nèi)容則表明安裝成功:
LibreOffice 25.2.3.2 bbb074479178df812d175f709636b368952c2ce3
2、安裝python-docx
在已有的python環(huán)境下安裝python-docx可以使用以下命令:
pip install python-docx
三、代碼實(shí)現(xiàn)
1、轉(zhuǎn)換成docx
根據(jù)上面的步驟,先進(jìn)行doc到docx的轉(zhuǎn)換,我們可以使用以下命令進(jìn)行轉(zhuǎn)換:
soffice --headless --convert-to <目標(biāo)格式> <輸入文件> [--outdir <輸出目錄>]
當(dāng)然這里需要再Python中進(jìn)行命令行的調(diào)用,直接上代碼:
import os import subprocess import re def convert_doc_to_docx(doc_path, output_dir, soffice_path=None): """ 使用 LibreOffice 將 .doc 轉(zhuǎn)換為 .docx :param doc_path: .doc 文件路徑 :param output_dir: 輸出目錄(默認(rèn)當(dāng)前目錄) :param soffice_path: LibreOffice 的 soffice.exe 完整路徑(可選) :return: 轉(zhuǎn)換后的 .docx 文件路徑 """ if not doc_path.lower().endswith('.doc'): raise ValueError("輸入文件必須是 .doc 格式") # 確保輸出目錄存在 os.makedirs(output_dir, exist_ok=True) # 構(gòu)造輸出路徑 base_name = os.path.splitext(os.path.basename(doc_path))[0] docx_path = os.path.join(output_dir, f"{base_name}.docx") # 檢查 LibreOffice 是否安裝 if soffice_path is None: try: # 嘗試調(diào)用 soffice 命令 subprocess.run(["soffice", "--version"], check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) soffice_cmd = ["soffice"] except FileNotFoundError: raise RuntimeError("LibreOffice 未安裝或未添加到系統(tǒng) PATH 中。請(qǐng)確保 LibreOffice 已正確安裝并在 PATH 中,或提供 soffice.exe 的完整路徑。") else: soffice_cmd = [soffice_path] # 使用 LibreOffice 轉(zhuǎn)換 try: subprocess.run( soffice_cmd + ["--headless","--nodefault","--nologo", "--convert-to", "docx", "--outdir", output_dir, doc_path], check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE ) if not os.path.exists(docx_path): raise RuntimeError(f"轉(zhuǎn)換失敗,未找到輸出文件: {docx_path}") return docx_path except subprocess.CalledProcessError as e: error_msg = f"轉(zhuǎn)換失敗: {e.stderr.decode()}" raise RuntimeError(error_msg)
在上面的代碼中先進(jìn)行LibreOffice環(huán)境是否安裝的檢測(cè),然后調(diào)用命令行進(jìn)行目標(biāo)文件的轉(zhuǎn)換,轉(zhuǎn)換完成的文件放到output_dir目錄下。
2、讀取和修改
轉(zhuǎn)換成docx文件后就可以使用python-docx依賴(lài)對(duì)數(shù)據(jù)進(jìn)行操作了,下面的Python代碼實(shí)現(xiàn)了docx文檔內(nèi)表格的讀取:
from docx import Document def read_docx_tables(docx_path): """ 使用 python-docx 讀取 .docx 文件中的表格 :param docx_path: .docx 文件路徑 :return: 表格數(shù)據(jù)列表(每行是一個(gè)列表) """ try: doc = Document(docx_path) except Exception as e: raise RuntimeError(f"無(wú)法讀取 .docx 文件: {e}") tables_data = [] for i, table in enumerate(doc.tables): print(f"\n表格 {i + 1}:") table_data = [] for row_idx, row in enumerate(table.rows): row_data = [cell.text.strip() for cell in row.cells] # 清理單元格中的特殊字符 row_data = [clean_text(cell) for cell in row_data] table_data.append(row_data) print(row_data) tables_data.append(table_data) return tables_data
修改起來(lái)也是非常方便的,只需要在更新row.cells[索引].text后,執(zhí)行一下doc.save(docx_path)的操作,代碼如下:
from docx import Document def modify_docx_tables(docx_path, output_path=None, modify_func=None): """ 僅修改 .docx 文件中的表格數(shù)據(jù)(不讀取原有數(shù)據(jù)) :param docx_path: 輸入的 .docx 文件路徑 :param output_path: 輸出的 .docx 文件路徑(如果為 None,則覆蓋原文件) :param modify_func: 修改表格數(shù)據(jù)的函數(shù)(接收 table 并直接修改) """ if output_path is None: output_path = docx_path # 默認(rèn)覆蓋原文件 try: doc = Document(docx_path) except Exception as e: raise RuntimeError(f"無(wú)法讀取 .docx 文件: {e}") for i, table in enumerate(doc.tables): print(f"\n修改表格 {i + 1}:") """ 示例修改函數(shù):將所有單元格內(nèi)容改為 "MODIFIED" """ for row in table.rows: for cell in row.cells: cell.text = "MODIFIED" # 直接修改單元格內(nèi)容 # 保存修改后的文檔 doc.save(output_path) print(f"\n表格數(shù)據(jù)已修改并保存到: {output_path}")
四、總結(jié)
上面就是對(duì)doc格式的文檔表格的讀取和修改操作的全部?jī)?nèi)容了,雖然doc文件格式比較落后,但不可避免的有些公司可能有些比較古老的系統(tǒng),在日常生產(chǎn)中就使用到doc文件格式,如果你有這方面的需求,希望這篇文章能幫助到你。
以上就是Python提取Word表格數(shù)據(jù)的詳細(xì)教程的詳細(xì)內(nèi)容,更多關(guān)于Python提取Word表格數(shù)據(jù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python讀取Windows和Linux的CPU、GPU、硬盤(pán)等部件溫度的讀取方法
本文詳細(xì)介紹了如何使用Python在Windows和Linux系統(tǒng)上通過(guò)OpenHardwareMonitor和psutil庫(kù)讀取CPU、GPU等部件的溫度,包括Windows下的兩種方法以及Linux下的簡(jiǎn)單實(shí)現(xiàn),感興趣的小伙伴跟著小編一起來(lái)看看吧2025-02-02python 時(shí)間 T 去掉 帶上ms 毫秒 時(shí)間格式的操作
這篇文章主要介紹了python 時(shí)間 T 去掉 帶上ms 毫秒 時(shí)間格式的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04Python下調(diào)用Linux的Shell命令的方法
有時(shí)候難免需要直接調(diào)用Shell命令來(lái)完成一些比較簡(jiǎn)單的操作,這篇文章主要介紹了Python下調(diào)用Linux的Shell命令的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-06-06Python3.4實(shí)現(xiàn)從HTTP代理網(wǎng)站批量獲取代理并篩選的方法示例
這篇文章主要介紹了Python3.4實(shí)現(xiàn)從HTTP代理網(wǎng)站批量獲取代理并篩選的方法,涉及Python網(wǎng)絡(luò)連接、讀取、判斷等相關(guān)操作技巧,需要的朋友可以參考下2017-09-09python區(qū)塊鏈創(chuàng)建多個(gè)交易教程
這篇文章主要為大家介紹了python區(qū)塊鏈創(chuàng)建多個(gè)交易的實(shí)現(xiàn)示例教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05yolov5 win10 CPU與GPU環(huán)境搭建過(guò)程
這篇文章主要介紹了yolov5 win10 CPU與GPU環(huán)境搭建過(guò)程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04Python2.5/2.6實(shí)用教程 入門(mén)基礎(chǔ)篇
本文方便有經(jīng)驗(yàn)的程序員進(jìn)入Python世界.本文適用于python2.5/2.6版本.2009-11-11