溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python中怎么將Word文檔轉(zhuǎn)換為Excel表格

發(fā)布時(shí)間:2021-07-10 14:43:08 來(lái)源:億速云 閱讀:749 作者:Leah 欄目:大數(shù)據(jù)

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ī)律:

  1. 題型以大寫(xiě)數(shù)字開(kāi)頭

  2. 題目以普通數(shù)字+.開(kāi)頭

  3. 選項(xiàng)以括號(hào)+字母開(kāi)頭

?

額外需要注意的:

開(kāi)頭幾行文本也存在普通數(shù)字+.開(kāi)頭的,需要直接排除。

第7題的題目,和第19題的選項(xiàng)存在一些特殊的空白字符需要排除,

括號(hào)和小數(shù)點(diǎn)都同時(shí)存在半角和全角兩種情況。

?

對(duì)于需要注意的第二點(diǎn):

Python中怎么將Word文檔轉(zhuǎn)換為Excel表格

查看一下這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ì)如下:

Python中怎么將Word文檔轉(zhuǎn)換為Excel表格

根據(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)化字典并存儲(chǔ)

然后我們遍歷結(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é)果:

如何用Python將Word文檔轉(zhuǎn)換為Excel表格

最終保存結(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)

最終得到的文件:

Python中怎么將Word文檔轉(zhuǎn)換為Excel表格

關(guān)于Python中怎么將Word文檔轉(zhuǎn)換為Excel表格問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI