天天看點

# yyds幹貨盤點 # 盤點一個Python自動化辦公的實戰案例

大家好,我是皮皮。

一、前言

前幾天在Python鑽石交流群【Hxy任我肥】問了一個Python自動化辦公的問題,提問截圖如下:

# yyds幹貨盤點 # 盤點一個Python自動化辦公的實戰案例

想要的效果是下圖這樣的:

# yyds幹貨盤點 # 盤點一個Python自動化辦公的實戰案例

準确來說,這個都不算是問題了,而是一個實實在在的需求。

二、實作過程

這裡【Jason】給了一個可行的思路,如下:

# yyds幹貨盤點 # 盤點一個Python自動化辦公的實戰案例

後來【瑜亮老師】給了一個具體的代碼,如下所示:

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)      

真的太強了!

# yyds幹貨盤點 # 盤點一個Python自動化辦公的實戰案例

代碼運作之後可以得到預期的結果,如下圖所示:

# yyds幹貨盤點 # 盤點一個Python自動化辦公的實戰案例

後來【狂吃山楂片】基于此代碼,來了個簡易版的,代碼如下所示:

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)      

這技術真是到家了,出神入化的。

# yyds幹貨盤點 # 盤點一個Python自動化辦公的實戰案例

代碼運作之後,也完全可以實作這個需求。

# yyds幹貨盤點 # 盤點一個Python自動化辦公的實戰案例

後來【瑜亮老師】還給了一個代碼,也非常贊,如下所示:

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+\.[√×]'比對到,這樣就一步到位了。不用再用清單推導式構造答案。

# yyds幹貨盤點 # 盤點一個Python自動化辦公的實戰案例

你以為這就完事了?

後來【甯同學】使用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')      

運作之後得到的結果如下圖所示:

三、總結