Python提取Word表格數(shù)據(jù)的詳細(xì)教程
一、編寫目的
最近由于工作上的需要,需要使用Python完成DOC文檔格式數(shù)據(jù)的讀取和修改工作,但通過查閱相關(guān)資料,直接對(duì)DOC文檔進(jìn)行讀取和修改沒有相關(guān)的依賴(主要為doc文件為較早的windows系統(tǒng)支持格式),需要將DOC文件轉(zhuǎn)換為.docx格式,為什么是docx格式?
- ??
.docx是 XML 格式,通常無(wú)編碼問題??,但若從其他格式轉(zhuǎn)換可能出錯(cuò)。 - python-docx依賴庫(kù)可以直接對(duì)docx文檔格式進(jìn)行操作,但無(wú)法對(duì)doc格式進(jìn)行操作。
那么問題就轉(zhuǎn)變?yōu)槿绾螌oc格式轉(zhuǎn)換為.docx格式的問題,有下面的解決方法:
- 如果你在windows系統(tǒng)上且安裝有Microsoft Word 可以使用pywin32調(diào)用Word提供的COM口進(jìn)行格式轉(zhuǎn)換。
那如果就不想花錢或者安裝Word,或者我使用的是其它系統(tǒng)(如Linux系統(tǒng))又該如何轉(zhuǎn)換doc格式到.docx格式呢?
這里也找到了相關(guān)的軟件支持:LibreOffice。它提供了和Word幾乎相同的功能,但其為免費(fèi)開源的,并且可以通過命令行進(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)可以通過下面的命令進(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依賴對(duì)數(shù)據(jù)進(jìn)行操作了,下面的Python代碼實(shí)現(xiàn)了docx文檔內(nèi)表格的讀?。?/p>
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鍵鼠操作自動(dòng)化庫(kù)PyAutoGUI簡(jiǎn)介(小結(jié))
這篇文章主要介紹了Python鍵鼠操作自動(dòng)化庫(kù)PyAutoGUI簡(jiǎn)介,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05
python 監(jiān)控服務(wù)器是否有人遠(yuǎn)程登錄(詳細(xì)思路+代碼)
這篇文章主要介紹了python 監(jiān)控服務(wù)器是否有人遠(yuǎn)程登錄的方法,幫助大家利用python 監(jiān)控服務(wù)器,感興趣的朋友可以了解下2020-12-12
VSCode2022配置Python3.9.6的詳細(xì)教程
這篇文章主要介紹了VSCode2022配置Python3.9.6教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-09-09
10 行 Python 代碼教你自動(dòng)發(fā)送短信(不想回復(fù)工作郵件妙招)
這篇文章主要介紹了10 行 Python 代碼教你自動(dòng)發(fā)送短信(不想回復(fù)工作郵件妙招),目前在國(guó)內(nèi)通過手機(jī)短信保障信息安全是比較常見的,具體實(shí)例代碼大家跟隨小編一起通過本文學(xué)習(xí)吧2018-10-10
python中Tkinter實(shí)現(xiàn)分頁(yè)標(biāo)簽的示例代碼
這篇文章主要介紹了python中Tkinter實(shí)現(xiàn)分頁(yè)標(biāo)簽的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
python中根據(jù)字符串調(diào)用函數(shù)的實(shí)現(xiàn)方法
下面小編就為大家?guī)?lái)一篇python中根據(jù)字符串調(diào)用函數(shù)的實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考,一起跟隨小編過來(lái)看看吧2016-06-06
Python使用DuckDB秒級(jí)處理超大Excel文件的終極指南
你是否經(jīng)歷過這樣的絕望:雙擊打開一個(gè) 500MB 的 Excel 文件,看著鼠標(biāo)光標(biāo)變成旋轉(zhuǎn)的圓圈,內(nèi)存占用飆升,最后屏幕變白顯示未響應(yīng),本文將手把手教你如何利用 DuckDB 輕松讀取、查詢和分析超大 Excel 文件,需要的朋友可以參考下2026-02-02
利用python中集合的唯一性實(shí)現(xiàn)去重
集合,用{ }表示,集合中所有元素具有唯一性。這篇文章給大家介紹利用python中集合的唯一性實(shí)現(xiàn)去重,感興趣的朋友一起看看吧2020-02-02

