參考摘取原文:https://www.sohu.com/a/281740874_99987664(感謝大佬)
https://www.cnblogs.com/zhaobowen/p/13807092.html(感謝大佬)
https://www.jb51.net/article/139671.htm(感謝大佬)
背景:
Python 中可以讀取 word 文件的庫有 python-docx 和 pywin32。
優點缺點python-docx跨平台只能處理 .docx 格式,不能處理.doc格式pywin32僅限 windows 平台.doc 和 .docx 都能處理。
一. pywin32模塊
這個庫很強大,不僅僅可以讀取 word,但是網上介紹用 pywin32 讀取 .doc 的文章真不多,因為,真心不好用。
以下是 pywin32 讀取 .doc 的代碼示例,但是讀取表格有問題,輸出全是空,原因不明,因為不打算用所以沒有深入研究。另外,如果表格中有縱向合並單元格,會報錯:“無法訪問此集合中單獨的行,因為表格有縱向合並的單元格。”
源碼:
from win32com.client import Dispatch
word = Dispatch('Word.Application') # 打開word應用程序
# word = DispatchEx('Word.Application') # 啟動獨立的進程
word.Visible = 0 # 后台運行,不顯示
word.DisplayAlerts = 0 # 不警告
path = r'E:\abc\test.doc'
doc = word.Documents.Open(FileName=path, Encoding='gbk')
for para in doc.paragraphs:
print(para.Range.Text)
for t in doc.Tables:
for row in t.Rows:
for cell in row.Cells:
print(cell.Range.Text)
doc.Close()
word.Quit
但是 pywin32 有另外一個功能,就是將 .doc 格式另存為 .docx 格式,這樣我們就可以使用 python-docx 來處理了。
(1)首先把pywin32模塊安裝上,並引入
(2)其次將doc文件轉換為docx文件,然后讀取內容
【下面的比較詳細,僅供自己學習】
python-docx讀取doc,docx文檔
API: http://python-docx.readthedocs.io/en/latest/#api-documentation
1.將doc轉為docx
python3.8中win32com 要安裝pypiwin32 pip install pypiwin32
from win32com import client as wc word = wc.Dispatch("Word.Application") doc = word.Documents.Open(路徑+名稱.doc) doc.SaveAs(路徑+名稱.docx, 12) 12為docx doc.Close() word.Quit()
2.讀取段落
import docx docStr = Document(docName) 打開文檔 for paragraph in docStr.paragraphs: parStr = paragraph.text --》paragraph.style.name == 'Heading 1' 一級標題 --》paragraph.paragraph_format.alignment == 1 居中顯示 --》paragraph.style.next_paragraph_style.paragraph_format.alignment == 1 下一段居中顯示 --》paragraph.style.font.color
3.讀取表格
numTables = docStr.tables
for table in numTables: #行列個數 row_count = len(table.rows) col_count = len(table.columns) for i in range(row_count): row = table.rows[i].cells i行j列內容:row[j].text 或者: row_count = len(table.rows) col_count = len(table.columns) for i in range(row_count): for j in range(col_count): print(table.cell(i,j).text)
4.按樣式讀取
讀取標題
for p in doc.paragraphs: if p.style.name=='Heading 1': print(p.text)
import re for p in doc.paragraphs: if re.match("^Heading \d+$",p.style.name): print(p.text)
讀取正文
for p in doc.paragraphs: if p.style.name=='Normal': print(p.text)
獲取docx支持的樣式
from docx.enum.style import WD_STYLE_TYPE for i in s: if i.type==WD_STYLE_TYPE.PARAGRAPH: print(i.name)
5.獲取文字格式信息
paragraph 對象 里還有更小的 run 對象,run 對象才包含了段落對象的文字信息。
paragraph.text 方法也是通過 run 對象的方法獲取到文字信息的:
paragraph.text 方法源碼: def text(self): text = '' for run in self.runs: text += run.text return text
文字的字體、大小、下划線等信息都包含在 run 對象中(不清楚的看前面的博客):
獲取段落的 run 對象列表 runs = par0.runs print(runs) 獲取 run 對象 run_0 = runs[0] print(run_0.text) # 獲取 run 對象文字信息 打印結果: 堅持因地制宜,差異化打造特色小鎮, 文檔 段落 和 run 對象示意:
獲取文字格式信息:
# 獲取文字格式信息 print('字體名稱:',run_0.font.name) # 字體名稱: 宋體 print('字體大小:',run_0.font.size) # 字體大小: 152400 print('是否加粗:',run_0.font.bold) # 是否加粗: None print('是否斜體:',run_0.font.italic) # 是否斜體: True print('字體顏色:',run_0.font.color.rgb) # 字體顏色: FF0000 print('字體高亮:',run_0.font.highlight_color) # 字體高亮: YELLOW (7) print('下划線:',run_0.font.underline) # 下划線: True print('刪除線:',run_0.font.strike) # 刪除線: None print('雙刪除線:',run_0.font.double_strike) # 雙刪除線: None print('下標:',run_0.font.subscript) # 下標: None print('上標:',run_0.font.superscript) # 上標: None LIK2
6.設置首行縮進
from docx.shared import Inches,Pt par2 = doc.add_paragraph('段落文本') # 左縮進,0.5 英寸 par2.paragraph_format.left_indent = Inches(0.5) # 右縮進,20 磅 par2.paragraph_format.right_indent = Pt(20) # 首行縮進 par2.paragraph_format.first_line_indent = Inches(1)
查看首行縮進單位
from docx import Document from docx.shared import Inches from docx.oxml.ns import qn from docx.shared import Cm, Pt from docx.enum.text import WD_PARAGRAPH_ALIGNMENT from docx.shared import RGBColor myDocument = Document('2020年建交集團3月分析報告.docx') for paragraph in myDocument.paragraphs: print(paragraph.paragraph_format.first_line_indent) print(dir(paragraph))
【批量的讀取doc文檔】
解決方案:利用python將大批.doc文件轉化為.docx文件,再讀寫.docx文件
問題分析:python利用python-docx (0.8.6)庫可以讀取.docx文件或.txt文件,且一路暢通無阻,而對.doc文件本身python是無能為力的,那有很多同學就不服氣,我手動把.doc文件的后綴名改為.docx或.txt不就解決問題了嗎?答案是不能的,簡單修改后綴名,那么文件就被你玩壞了,別說打不開,就是打開也是天書啊(亂碼)。python無法操作.doc文件是他的先天不足,但是我們不要鑽牛角尖一定要在互聯網上找到一種源碼直接讀取.doc文件,一調用就好了,但是不幸的是,你可能在網上也找不到解決方案。正當我一籌莫展之時,我將.doc文檔利用手動的方式“另存為”.docx文檔,就能夠成功打開轉化后的.docx文檔,於是我就嘗試利用代碼方式完成這個手動的“另存為”功能,問題得以解決。
直接上python代碼(首先你需要先安裝pypewin32庫):
1
2
3
4
5
6
7
8
|
# -*- coding: utf-8 -*-:
import sys
import pickle
import re
import codecs
import string
import shutil
from win32com import client as wc
|
1
|
def doSaveAas(): # 想批處理文件,你就用for循環唄,我一次性處理了100多個文件,代碼執行不超過2分鍾,可以解決問題,目標文件路徑可以自由改動,大家注意SaveAs方法中的參數,好多啊,別寫錯了
|
1
2
3
4
5
|
word = wc.Dispatch('Word.Application')
doc = word.Documents.Open(u'C:\\Users\\X\\PycharmProjects\\1\\大家好.doc') # 目標路徑下的文件
doc.SaveAs(u'C:\\Users\\X\\PycharmProjects\\1\\我是一枚小小的程序員X007.docx', 12, False, "", True, "", False, False, False, False) # 轉化后路徑下的文件
doc.Close()
word.Quit()
|
轉化為.docx文件后,在處理.docx文件,一路暢通無阻。