您好,登錄后才能下訂單哦!
Python中怎么將Word文檔轉(zhuǎn)換為Excel表格,針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。
測(cè)試word文檔讀取
先測(cè)試一個(gè)word文檔前1頁(yè)的數(shù)據(jù)讀取:
from docx import Document doc = Document("編號(hào)02 質(zhì)檢員高級(jí)技師(一級(jí))理論試卷.docx") for i, paragraph in enumerate(doc.paragraphs[:55]): print(i, paragraph.text)
匹配題型、題目和具體的選項(xiàng)
現(xiàn)在我們需要做的是就是匹配題型、題目和具體的選項(xiàng),觀察可以發(fā)現(xiàn)規(guī)律:
題型以大寫(xiě)數(shù)字開(kāi)頭
題目以普通數(shù)字+.開(kāi)頭
選項(xiàng)以括號(hào)+字母開(kāi)頭
?
額外需要注意的:
開(kāi)頭幾行文本也存在普通數(shù)字+.開(kāi)頭的,需要直接排除。
第7題的題目,和第19題的選項(xiàng)存在一些特殊的空白字符需要排除,
括號(hào)和小數(shù)點(diǎn)都同時(shí)存在半角和全角兩種情況。
?
對(duì)于需要注意的第二點(diǎn):
查看一下這2處的空白字符:
doc.paragraphs[21].text
'7.(\xa0\xa0)是第一家實(shí)施六西格瑪管理的公司。\xa0'
doc.paragraphs[49].text
'(A)參數(shù)設(shè)計(jì) (B)常量設(shè)計(jì)\u3000 (C)變量設(shè)計(jì)\u3000\u3000 (D)系統(tǒng)設(shè)計(jì)'
發(fā)現(xiàn)分別是\xa0和\u3000。
整理好大致思路,我組織一下處理代碼:
import re from docx import Document doc = Document("編號(hào)02 質(zhì)檢員高級(jí)技師(一級(jí))理論試卷.docx") black_char = re.compile("[\s\u3000\xa0]+") chinese_nums_rule = re.compile("[一二三四]、(.+?)\(") title_rule = re.compile("\d+.") option_rule = re.compile("\([ABCDEF]\)") option_rule_search = re.compile("\([ABCDEF]\)[^(]+") # 從word文檔的“一、單項(xiàng)選擇題”開(kāi)始遍歷數(shù)據(jù) for paragraph in doc.paragraphs[5:25]: # 去除空白字符,將全角字符轉(zhuǎn)半角字符,并給括號(hào)之間調(diào)整為中間二個(gè)空格 line = black_char.sub("", paragraph.text).replace( "(", "(").replace(")", ")").replace(".", ".").replace("()", "( )") # 對(duì)于空白行就直接跳過(guò) ifnot line: continue if title_rule.match(line): print("題目", line) elif option_rule.match(line): print("選項(xiàng)", option_rule_search.findall(line)) else: chinese_nums_match = chinese_nums_rule.match(line) if chinese_nums_match: print("題型", chinese_nums_match.group(1))
保存匹配到的數(shù)據(jù)到結(jié)構(gòu)化字典
現(xiàn)在我打算將當(dāng)前匹配出來(lái)的文本數(shù)據(jù)存儲(chǔ)成字典形式的結(jié)構(gòu)化數(shù)據(jù),字典結(jié)構(gòu)的設(shè)計(jì)如下:
根據(jù)上述設(shè)計(jì)完善代碼:
import re from docx import Document from collections import OrderedDict doc = Document("編號(hào)02 質(zhì)檢員高級(jí)技師(一級(jí))理論試卷.docx") black_char = re.compile("[\s\u3000\xa0]+") chinese_nums_rule = re.compile("[一二三四]、(.+?)\(") title_rule = re.compile("\d+.") option_rule = re.compile("\([ABCDEF]\)") option_rule_search = re.compile("\([ABCDEF]\)[^(]+") # 保存最終的結(jié)構(gòu)化數(shù)據(jù) question_type2data = OrderedDict() # 從word文檔的“一、單項(xiàng)選擇題”開(kāi)始遍歷數(shù)據(jù) for paragraph in doc.paragraphs[5:]: # 去除空白字符,將全角字符轉(zhuǎn)半角字符,并給括號(hào)之間調(diào)整為中間一個(gè)空格 line = black_char.sub("", paragraph.text).replace( "(", "(").replace(")", ")").replace(".", ".").replace("()", "( )") # 對(duì)于空白行就直接跳過(guò) ifnot line: continue if title_rule.match(line): options = title2options.setdefault(line, []) elif option_rule.match(line): options.extend(option_rule_search.findall(line)) else: chinese_nums_match = chinese_nums_rule.match(line) if chinese_nums_match: question_type = chinese_nums_match.group(1) title2options = question_type2data.setdefault(question_type, OrderedDict())
然后我們遍歷結(jié)構(gòu)化字典,將數(shù)據(jù)保存到pandas對(duì)象中:
import pandas as pd result = [] max_options_len = 0 for question_type, title2options in question_type2data.items(): for title, options in title2options.items(): result.append([question_type, title, *options]) options_len = len(options) if options_len > max_options_len: max_options_len = options_len df = pd.DataFrame(result, columns=[ "題型", "題目"]+[f"選項(xiàng){i}"for i in range(1, max_options_len+1)]) # 題型可以簡(jiǎn)化下,去掉選擇兩個(gè)字 df['題型'] = df['題型'].str.replace("選擇", "") df.head()
結(jié)果:
最終保存結(jié)果:
df.to_excel("result.xlsx", index=False)
最終完整代碼:
import pandas as pd import re from docx import Document from collections import OrderedDict doc = Document("編號(hào)02 質(zhì)檢員高級(jí)技師(一級(jí))理論試卷.docx") black_char = re.compile("[\s\u3000\xa0]+") chinese_nums_rule = re.compile("[一二三四]、(.+?)\(") title_rule = re.compile("\d+.") option_rule = re.compile("\([ABCDEF]\)") option_rule_search = re.compile("\([ABCDEF]\)[^(]+") # 保存最終的結(jié)構(gòu)化數(shù)據(jù) question_type2data = OrderedDict() # 從word文檔的“一、單項(xiàng)選擇題”開(kāi)始遍歷數(shù)據(jù) for paragraph in doc.paragraphs[5:]: # 去除空白字符,將全角字符轉(zhuǎn)半角字符,并給括號(hào)之間調(diào)整為中間一個(gè)空格 line = black_char.sub("", paragraph.text).replace( "(", "(").replace(")", ")").replace(".", ".").replace("()", "( )") # 對(duì)于空白行就直接跳過(guò) ifnot line: continue if title_rule.match(line): options = title2options.setdefault(line, []) elif option_rule.match(line): options.extend(option_rule_search.findall(line)) else: chinese_nums_match = chinese_nums_rule.match(line) if chinese_nums_match: question_type = chinese_nums_match.group(1) title2options = question_type2data.setdefault( question_type, OrderedDict()) result = [] max_options_len = 0 for question_type, title2options in question_type2data.items(): for title, options in title2options.items(): result.append([question_type, title, *options]) options_len = len(options) if options_len > max_options_len: max_options_len = options_len df = pd.DataFrame(result, columns=[ "題型", "題目"]+[f"選項(xiàng){i}"for i in range(1, max_options_len+1)]) # 題型可以簡(jiǎn)化下,去掉選擇兩個(gè)字 df['題型'] = df['題型'].str.replace("選擇", "") df.to_excel("result.xlsx", index=False)
最終得到的文件:
關(guān)于Python中怎么將Word文檔轉(zhuǎn)換為Excel表格問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。