大家好,我是皮皮。
一、前言
前幾天在Python鑽石交流群【Hxy任我肥】問了一個Python自動化辦公的問題,提問截圖如下:
想要的效果是下圖這樣的:
準确來說,這個都不算是問題了,而是一個實實在在的需求。
二、實作過程
這裡【Jason】給了一個可行的思路,如下:
後來【瑜亮老師】給了一個具體的代碼,如下所示:
import re
from docx import Document
import pandas as pd
document = Document("判斷(括号處理)(1).docx")
all_paragraphs = document.paragraphs
data = [paragraph.text for paragraph in all_paragraphs if '√' in paragraph.text or '×' in paragraph.text]
data = ''.join(data)
res = re.findall('[√×]', data, re.S)
res = [f'{k + 1}.{v}' for k, v in enumerate(res)]
df = pd.DataFrame(res)
df.to_excel('test9-13.xlsx', index=False, header=None)
真的太強了!
代碼運作之後可以得到預期的結果,如下圖所示:
後來【狂吃山楂片】基于此代碼,來了個簡易版的,代碼如下所示:
import re
from docx import Document
import pandas as pd
document = Document(r"判斷(括号處理)(1).docx")
text = document.part.blob.decode('utf-8')
text = re.sub(r'<.*?>', '', text)
text = re.sub(r'\.\s+', r'.', text)
df = pd.DataFrame(re.findall(r'\d+\.[√×]', text))
df.to_excel('result.xlsx', header=None, index=False)
這技術真是到家了,出神入化的。
代碼運作之後,也完全可以實作這個需求。
後來【瑜亮老師】還給了一個代碼,也非常贊,如下所示:
data = [paragraph.text for paragraph in all_paragraphs if '√' in paragraph.text or '×' in paragraph.text]
# 合并為一個長字元串,然後替換删除所有的空格
data = ''.join(data).replace(' ', '')
# 使用re正規表達式提取出所有含有題号的答案
res = re.findall(r'\d+\.[√×]', data, re.S)
df = pd.DataFrame(res)
df.to_excel('test9-13.xlsx', index=False, header=None)
真讓人歎為觀止!把多餘的空格都替換删除,可以防止答案中含有空格而導緻不能被正則r'\d+\.[√×]'比對到,這樣就一步到位了。不用再用清單推導式構造答案。
你以為這就完事了?
後來【甯同學】使用openpyxl庫也搞定了,代碼如下圖所示:
import re
import docx
import openpyxl
def str_work(string:str):
return [*filter(None,re.split('\.',re.sub('\d+','',string.replace(' ', '').replace('\n', ''))))]
wb = openpyxl.Workbook()
ws = wb.active
ws.append(['題目','答案'])
doc = docx.Document(r'C:\Users\Administrator\Desktop\判斷(括号處理).docx')
doc_text = '\n'.join(( i.text for i in doc.paragraphs[3:]))
doc_list = doc_text.split('\n一、判斷題')
title_row = [i.strip() for i in doc_list[0].split('\n') if i.strip().split('、')!=['']]
answer_row = [i for i in str_work(doc_list[1])]
for i in zip(title_row,answer_row):
ws.append(list(i))
wb.save('1.xlsx')
運作之後得到的結果如下圖所示: