doc,docx解析的那些事
├── _rels
|----.rels.xml ├── docProps │ ├── app.xml │── core.xml └── word ├── _rels │ ├── document.xml.rels └── footnotes.xml.rels ├── document.xml -----------------存放文本的主要文件├── fontTable.xml
├── footnotes.xml ├── media ------------------------存放docx文檔里的圖片、音頻、視頻等├── numbering.xml ├── settings.xml ├── styles.xml ├── theme │ └── theme1.xml └── webSettings.xml上面的文檔有些是必需的,有一些可有可無,具體可以查閱相關文檔
既然是打包文件,我們可以使用python對其進行解析了,比如我們想獲取其中的document.xmlimport zipfiledef parseZip(filepath): zipf = zipfile.Zipfile(filepath) return zipf.read("word/document.xml")
import win32comfrom win32com.client import Dispatch,constantsw = Dispatch(Word.Application)w.Visible = 0w.DisplayAlerts=0doc = w.Documents.Open("input.doc")doc.SaveAs("output.docx",FileFormat=12)
現在我們的數據格式都是相同的了。
那就要對於docx進行解析,並且獲取到表格,綜合對比了一下,發現 python-docx更方便一些。首先我們對於輸入的文檔進行格式判斷,定義函數judgeType()
其次是解析文檔最後把得到的表格寫到excel裡面。代碼如下:#coding:utf-8import win32comfrom win32com.client import Dispatch,constantsimport docximport xlwtimport osimport sys# 判斷輸入的文檔格式def judgeType(file_path): tmp_result = os.path.splitext(file_path) file_type = tmp_result[1] return file_type# 格式轉換def convertFormat(file_path): w = Dispatch(Word.Application) w.Visible = 0 w.DisplayAlerts=0 doc = w.Documents.Open(file_path) doc.SaveAs("tmp.docx", FileFormat=12)def main(): file_path = sys.argv[1] # print file_path file_type = judgeType(file_path) # print file_type if file_type==.doc: convertFormat(file_path) doc = docx.Document("tmp.docx") book = xlwt.Workbook() tables = doc.tables for index,table in enumerate(tables): i = index+1 sheet = book.add_sheet("%dsheet"%i) for i_r, row in enumerate(table.rows): tmp_i = -1 for cell in row.cells: tmp_i=tmp_i+1 cell_data = [] for p in cell.paragraphs: cell_data.append(p.text) sheet.write(i_r, tmp_i, "
".join(cell_data)) book.save(sys.argv[2]) os.remove("tmp.docx") if file_type==.docx: doc = docx.Document(file_path) book = xlwt.Workbook() tables = doc.tables for index, table in enumerate(tables): i = index + 1 sheet = book.add_sheet("%dsheet" % i) for i_r, row in enumerate(table.rows): tmp_i = -1 for cell in row.cells: tmp_i = tmp_i + 1 cell_data = [] for p in cell.paragraphs: cell_data.append(p.text) sheet.write(i_r, tmp_i, "
".join(cell_data)) book.save(sys.argv[2])if __name__==__main__: main()
[2]https://geddy.cn/blog/item/jie-xi-docx
推薦閱讀: