随着 2022 修订课程标准的实施,科目变多了,相应地,每学期都要重新撰写评价计划书的情况也随之出现。
问题在于,评价计划书要求把各单元的成就标准、成就水平等全部逐项填写,是一个形式化的工作。
而这些标准又并不是教师自己撰写的内容,而只是单纯的复制+粘贴。
于是我先把相关内容整理成表格,然后利用 Excel 或电子表格中的 FILTER 和 TEXTJOIN 函数,尝试让它自动合并生成。
1. 制作成就水平数据库
各选修课程的成就水平可以在下方的 KICE 学生评价支援门户中获取。
从顶部目录中的 [小学/初中/高中] -> [课程成就标准] -> [成就标准资料室] 中搜索后下载即可。
例如“世界公民与地理”的成就水平如下所示。
问题是,这样的成就标准少则 15 条,每一条成就标准对应的成就水平都要复制并合并成 A~E 五个等级。
现在来把这些资料制作成表格。

首先,把 hwp 格式的文件另存为 hwpx 文件。
hwpx 文件会以 xml 数据形式保存内部文件结构,因此可以用其他程序对其内部进行解析。

然后使用 Python 抽取 hwpx 内部的表格。
下面的代码当然借助了 chatGPT 大佬的帮助。
hwpx 文件是 zip + xml 结构,因此可以用 Python 读取内部 xml 并抽取表格。
// 이 코드는 생성형 AI를 이용해 제작한 코드입니다.
import zipfile
import xml.etree.ElementTree as ET
from openpyxl import Workbook
hwpx_path = "사회과 선택과목 성취수준 현장 보급본.hwpx"
xlsx_path = "output.xlsx"
def tag_name(elem):
return elem.tag.split("}")[-1]
def collect_text(node):
texts = []
# tc 내부에 중첩 tbl이 있으면 그 하위 텍스트는 제외한다.
stack = [node]
while stack:
cur = stack.pop()
if cur is not node and tag_name(cur) == "tbl":
continue
if tag_name(cur) == "t" and cur.text:
t = cur.text.strip()
if t:
texts.append(t)
children = list(cur)
stack.extend(reversed(children))
return "\n".join(texts)
def is_title_like(text):
if not text:
return False
compact = text.replace(" ", "")
# 표 전체 내용을 붙여 놓은 긴 문장은 제목으로 취급하지 않는다.
if len(text) > 80:
return False
# 표 헤더/본문 키워드가 포함되면 제목 행으로 넣지 않는다.
if "성취기준" in compact and "성취수준" in compact:
return False
return True
wb = Workbook()
ws = wb.active
ws.title = "tables"
saved_table_count = 0
current_row = 1
with zipfile.ZipFile(hwpx_path, "r") as z:
section_files = sorted(
name for name in z.namelist()
if name.startswith("Contents/section") and name.endswith(".xml")
)
for section_file in section_files:
xml_data = z.read(section_file)
root = ET.fromstring(xml_data)
elems = list(root.iter())
for i, elem in enumerate(elems):
if tag_name(elem) != "tbl":
continue
tbl = elem
prev_text = ""
for j in range(i - 1, -1, -1):
if tag_name(elems[j]) != "p":
continue
texts = []
for x in elems[j].iter():
if tag_name(x) == "t" and x.text:
t = x.text.strip()
if t:
texts.append(t)
candidate = " ".join(texts)
if not candidate:
continue
if is_title_like(candidate):
prev_text = candidate
break
table_rows = []
for tr in tbl:
if tag_name(tr) != "tr":
continue
row_values = []
for tc in tr:
if tag_name(tc) != "tc":
continue
row_values.append(collect_text(tc))
if row_values:
table_rows.append(row_values)
if not table_rows:
continue
preview_text = "".join(table_rows[0])
# 1행 1셀 같은 요약성/오검출 표는 제외한다.
has_enough_shape = len(table_rows) >= 2 and any(len(r) >= 2 for r in table_rows)
if "성취기준별" in preview_text and "성취수준" in preview_text and has_enough_shape:
saved_table_count += 1
table_title = prev_text if is_title_like(prev_text) else ""
for row_values in table_rows:
# 1열에는 표 제목을 두고, 실제 표 데이터는 오른쪽(2열부터) 배치한다.
ws.cell(row=current_row, column=1, value=table_title)
first_value = row_values[0].strip() if row_values and isinstance(row_values[0], str) else ""
start_col = 3 if first_value in {"B", "C", "D", "E"} else 2
for col_idx, value in enumerate(row_values, start=start_col):
ws.cell(row=current_row, column=col_idx, value=value)
# 오른쪽으로 밀린(B/C/D/E) 행은 표의 첫 번째 열(2열)을 바로 윗행 값으로 채운다.
if start_col == 3 and current_row > 1:
ws.cell(row=current_row, column=2, value=ws.cell(row=current_row - 1, column=2).value)
current_row += 1
# 표 사이 한 줄 띄우기
current_row += 2
if saved_table_count == 0:
ws["A1"] = "조건에 맞는 표를 찾지 못했습니다."
wb.save(xlsx_path)
print(f"완료: {saved_table_count}개 표를 하나의 시트에 저장")这样一来,内部表格就会像下面这样被抽取出来。
即便如此,如果还有无法正确抽取出来的表格,那就手工稍微整理一下数据吧。

我就直接在 Excel 里用筛选和“分列”功能,把成就标准代码、内容、按成就标准划分的成就水平分别拆了出来。
如果对这些数据进行规范化,性能会更好,但人工核对会比较困难,所以我就保留成了重复字段。
做到这里,不禁想到,也许干脆申请公开这个数据库会更好。
2. 制作电子表格
一般学校在评价计划中会按周次填入相应的成就代码和成就标准。
所以我想,如果只要按月份选择成就代码,就能自动填充内容,那么输入评价计划会轻松得多。
电子表格是利用 filter 和 unique 函数,把要输入的科目、单元、成就代码组合起来生成的。
如果觉得难的话,我建议可以和 AI 一起做一做看。

在第一个工作表中,只要输入月份、周次、单元名、成就标准代码,最右边就会生成内容,只需复制粘贴即可。
中间绿色框部分是为了方便我核对自己输入的成就标准而做的。
通过这样的选择,就能自动完成单元别的成就标准及成就水平,以及学期层面的成就水平。

其实在一般学科中,所有成就标准都会写入评价计划,所以就算“全部塞进去”也没关系,但我是考虑到课程重构才这样设计的。
我还在犹豫,要不要再加一个把 A~E 全部合并起来的工作表。
另外我也做了一个用于表现性评价的工作表。

只要输入我想用于表现性评价的成就标准代码,它就会把 A~E 水平全部合并好,方便直接写进评价计划书。
我们真正需要思考的,并不是复制、粘贴,而是究竟要实施怎样的评价。
3. 使用后感

令人遗憾的是,许多教师即便在评价计划上倾注了大量时间,教室里的任何人也不会对那些成就水平的句子感到好奇。
这是因为,相比评价计划本身,按照评价计划落实出来的“评价本身”才更重要。
对那些在把成就标准写入评价标准之后才毕业的人,如果去问他们成就标准具体是什么,我敢肯定,没有人能记得住。
因此,可以说在评价标准中写入这些句子,只不过是毫无意义的形式化操作。
学校里的教育现场并不是像成就代码、成就标准那样静态的,而是动态的。
我在想,我们是不是更应该把时间用在思考评价本身的质量问题上,而不是追求评价计划的公文式完备性。
或许真正的使用后记还得等到 7~8 月实际使用之后才能写出来。
把这个电子表格分享给旁边办公室的老师后,对方说好像立刻就能完成第二学期的评价计划了,很高兴。
我想这大概会帮上不少忙。




댓글을 불러오는 중...