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