【python】后綴為doc的文件讀取


參考摘取原文: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文件,一路暢通無阻。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM