392 lines
15 KiB
Plaintext
392 lines
15 KiB
Plaintext
{
|
||
"cells": [
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 5,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"zip文件在文件夹中: 1.1(1)直线的倾斜角和斜率1\n",
|
||
"zip文件在文件夹中: 1.1(2)直线的倾斜角和斜率2\n",
|
||
"zip文件在文件夹中: 1.2(1)直线的方程1\n",
|
||
"zip文件在文件夹中: 1.2(2)直线的方程2\n",
|
||
"zip文件在文件夹中: 1.3(1)两条直线的位置关系1\n",
|
||
"zip文件在文件夹中: 1.3(2)两条直线的位置关系2\n",
|
||
"zip文件在文件夹中: 1.3(3)两条直线的位置关系3\n",
|
||
"zip文件在文件夹中: 1.4(1)点到直线的距离1\n",
|
||
"zip文件在文件夹中: 1.4(2)点到直线的距离2\n",
|
||
"zip文件在文件夹中: 2.1(1) 圆1\n",
|
||
"zip文件在文件夹中: 2.1(2) 圆2\n",
|
||
"zip文件在文件夹中: 2.1(3) 圆3\n",
|
||
"zip文件在文件夹中: 2.1(4) 圆4\n",
|
||
"正在处理1.1(1)直线的倾斜角和斜率1\n",
|
||
"2025届高一11班\n",
|
||
"2025届高一11班 有效\n",
|
||
"2025届高一12班\n",
|
||
"2025届高一12班 有效\n",
|
||
"2025届高一01班\n",
|
||
"2025届高一01班 有效\n",
|
||
"2025届高一04班\n",
|
||
"2025届高一04班 有效\n",
|
||
"2025届高一05班\n",
|
||
"2025届高一05班 有效\n",
|
||
"2025届高一06班\n",
|
||
"2025届高一06班 有效\n",
|
||
"2025届高一08班\n",
|
||
"2025届高一08班 有效\n",
|
||
"2025届高一09班\n",
|
||
"2025届高一09班 有效\n",
|
||
"正在处理1.1(2)直线的倾斜角和斜率2\n",
|
||
"2025届高一11班\n",
|
||
"2025届高一11班 有效\n",
|
||
"2025届高一12班\n",
|
||
"2025届高一12班 有效\n",
|
||
"2025届高一01班\n",
|
||
"2025届高一01班 有效\n",
|
||
"2025届高一02班\n",
|
||
"2025届高一02班 有效\n",
|
||
"2025届高一04班\n",
|
||
"2025届高一04班 有效\n",
|
||
"2025届高一05班\n",
|
||
"2025届高一05班 有效\n",
|
||
"2025届高一06班\n",
|
||
"2025届高一06班 有效\n",
|
||
"2025届高一08班\n",
|
||
"2025届高一08班 有效\n",
|
||
"2025届高一09班\n",
|
||
"2025届高一09班 有效\n",
|
||
"正在处理1.2(1)直线的方程1\n",
|
||
"2025届高一11班\n",
|
||
"2025届高一11班 有效\n",
|
||
"2025届高一12班\n",
|
||
"2025届高一12班 有效\n",
|
||
"2025届高一01班\n",
|
||
"2025届高一01班 有效\n",
|
||
"2025届高一02班\n",
|
||
"2025届高一02班 有效\n",
|
||
"2025届高一04班\n",
|
||
"2025届高一04班 有效\n",
|
||
"2025届高一05班\n",
|
||
"2025届高一05班 有效\n",
|
||
"2025届高一06班\n",
|
||
"2025届高一06班 有效\n",
|
||
"2025届高一07班\n",
|
||
"2025届高一07班 无效\n",
|
||
"2025届高一08班\n",
|
||
"2025届高一08班 有效\n",
|
||
"2025届高一09班\n",
|
||
"2025届高一09班 有效\n",
|
||
"正在处理1.2(2)直线的方程2\n",
|
||
"2025届高一11班\n",
|
||
"2025届高一11班 有效\n",
|
||
"2025届高一12班\n",
|
||
"2025届高一12班 有效\n",
|
||
"2025届高一01班\n",
|
||
"2025届高一01班 有效\n",
|
||
"2025届高一02班\n",
|
||
"2025届高一02班 有效\n",
|
||
"2025届高一04班\n",
|
||
"2025届高一04班 有效\n",
|
||
"2025届高一05班\n",
|
||
"2025届高一05班 有效\n",
|
||
"2025届高一06班\n",
|
||
"2025届高一06班 有效\n",
|
||
"2025届高一07班\n",
|
||
"2025届高一07班 无效\n",
|
||
"2025届高一08班\n",
|
||
"2025届高一08班 有效\n",
|
||
"2025届高一09班\n",
|
||
"2025届高一09班 有效\n",
|
||
"正在处理1.3(1)两条直线的位置关系1\n",
|
||
"2025届高一11班\n",
|
||
"2025届高一11班 有效\n",
|
||
"2025届高一12班\n",
|
||
"2025届高一12班 有效\n",
|
||
"2025届高一01班\n",
|
||
"2025届高一01班 有效\n",
|
||
"2025届高一04班\n",
|
||
"2025届高一04班 有效\n",
|
||
"2025届高一05班\n",
|
||
"2025届高一05班 有效\n",
|
||
"2025届高一06班\n",
|
||
"2025届高一06班 有效\n",
|
||
"2025届高一08班\n",
|
||
"2025届高一08班 有效\n",
|
||
"2025届高一09班\n",
|
||
"2025届高一09班 有效\n",
|
||
"正在处理1.3(2)两条直线的位置关系2\n",
|
||
"2025届高一11班\n",
|
||
"2025届高一11班 有效\n",
|
||
"2025届高一12班\n",
|
||
"2025届高一12班 有效\n",
|
||
"2025届高一01班\n",
|
||
"2025届高一01班 有效\n",
|
||
"2025届高一04班\n",
|
||
"2025届高一04班 有效\n",
|
||
"2025届高一05班\n",
|
||
"2025届高一05班 有效\n",
|
||
"2025届高一06班\n",
|
||
"2025届高一06班 有效\n",
|
||
"2025届高一08班\n",
|
||
"2025届高一08班 有效\n",
|
||
"2025届高一09班\n",
|
||
"2025届高一09班 有效\n",
|
||
"正在处理1.3(3)两条直线的位置关系3\n",
|
||
"2025届高一11班\n",
|
||
"2025届高一11班 有效\n",
|
||
"2025届高一12班\n",
|
||
"2025届高一12班 有效\n",
|
||
"2025届高一01班\n",
|
||
"2025届高一01班 有效\n",
|
||
"2025届高一04班\n",
|
||
"2025届高一04班 有效\n",
|
||
"2025届高一06班\n",
|
||
"2025届高一06班 有效\n",
|
||
"2025届高一05班\n",
|
||
"2025届高一05班 有效\n",
|
||
"2025届高一08班\n",
|
||
"2025届高一08班 有效\n",
|
||
"2025届高一09班\n",
|
||
"2025届高一09班 有效\n",
|
||
"正在处理1.4(1)点到直线的距离1\n",
|
||
"2025届高一11班\n",
|
||
"2025届高一11班 有效\n",
|
||
"2025届高一12班\n",
|
||
"2025届高一12班 有效\n",
|
||
"2025届高一01班\n",
|
||
"2025届高一01班 有效\n",
|
||
"2025届高一02班\n",
|
||
"2025届高一02班 有效\n",
|
||
"2025届高一04班\n",
|
||
"2025届高一04班 有效\n",
|
||
"2025届高一05班\n",
|
||
"2025届高一05班 有效\n",
|
||
"2025届高一06班\n",
|
||
"2025届高一06班 有效\n",
|
||
"2025届高一08班\n",
|
||
"2025届高一08班 有效\n",
|
||
"2025届高一09班\n",
|
||
"2025届高一09班 有效\n",
|
||
"正在处理1.4(2)点到直线的距离2\n",
|
||
"2025届高一11班\n",
|
||
"2025届高一11班 有效\n",
|
||
"2025届高一12班\n",
|
||
"2025届高一12班 有效\n",
|
||
"2025届高一01班\n",
|
||
"2025届高一01班 有效\n",
|
||
"2025届高一04班\n",
|
||
"2025届高一04班 有效\n",
|
||
"2025届高一05班\n",
|
||
"2025届高一05班 有效\n",
|
||
"2025届高一06班\n",
|
||
"2025届高一06班 有效\n",
|
||
"2025届高一08班\n",
|
||
"2025届高一08班 有效\n",
|
||
"2025届高一09班\n",
|
||
"2025届高一09班 有效\n",
|
||
"正在处理2.1(1) 圆1\n",
|
||
"2025届高一11班\n",
|
||
"2025届高一11班 有效\n",
|
||
"2025届高一12班\n",
|
||
"2025届高一12班 有效\n",
|
||
"2025届高一01班\n",
|
||
"2025届高一01班 有效\n",
|
||
"2025届高一02班\n",
|
||
"2025届高一02班 有效\n",
|
||
"2025届高一04班\n",
|
||
"2025届高一04班 有效\n",
|
||
"2025届高一05班\n",
|
||
"2025届高一05班 有效\n",
|
||
"2025届高一08班\n",
|
||
"2025届高一08班 无效\n",
|
||
"2025届高一06班\n",
|
||
"2025届高一06班 有效\n",
|
||
"正在处理2.1(2) 圆2\n",
|
||
"2025届高一11班\n",
|
||
"2025届高一11班 有效\n",
|
||
"2025届高一12班\n",
|
||
"2025届高一12班 有效\n",
|
||
"2025届高一01班\n",
|
||
"2025届高一01班 有效\n",
|
||
"2025届高一02班\n",
|
||
"2025届高一02班 有效\n",
|
||
"2025届高一04班\n",
|
||
"2025届高一04班 有效\n",
|
||
"2025届高一05班\n",
|
||
"2025届高一05班 有效\n",
|
||
"2025届高一06班\n",
|
||
"2025届高一06班 有效\n",
|
||
"2025届高一07班\n",
|
||
"2025届高一07班 无效\n",
|
||
"2025届高一08班\n",
|
||
"2025届高一08班 有效\n",
|
||
"2025届高一09班\n",
|
||
"2025届高一09班 有效\n",
|
||
"正在处理2.1(3) 圆3\n",
|
||
"2025届高一11班\n",
|
||
"2025届高一11班 有效\n",
|
||
"2025届高一12班\n",
|
||
"2025届高一12班 有效\n",
|
||
"2025届高一01班\n",
|
||
"2025届高一01班 有效\n",
|
||
"2025届高一06班\n",
|
||
"2025届高一06班 有效\n",
|
||
"2025届高一08班\n",
|
||
"2025届高一08班 有效\n",
|
||
"2025届高一09班\n",
|
||
"2025届高一09班 有效\n",
|
||
"正在处理2.1(4) 圆4\n",
|
||
"2025届高一11班\n",
|
||
"2025届高一11班 有效\n",
|
||
"2025届高一12班\n",
|
||
"2025届高一12班 有效\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"import zipfile,os,re,time\n",
|
||
"import pandas as pd\n",
|
||
"from pathlib import Path\n",
|
||
"\n",
|
||
"#设置届别与接受的比例阈值\n",
|
||
"gradename = \"2025届高一\"\n",
|
||
"threshold = 0.5 #当班级提交人数超过该比例时数据有效\n",
|
||
"\n",
|
||
"#设置工作目录, 要求工作目录中恰有一个.tex文件(或.txt文件)和一些.zip文件,其余不论\n",
|
||
"filepath = \"数据导入作业文件\"\n",
|
||
"\n",
|
||
"#生成文件名tex_file和zip_file\n",
|
||
"files = [os.path.join(filepath,f) for f in os.listdir(filepath)]\n",
|
||
"tex_file = [f for f in files if \".tex\" in f or \".txt\" in f][0]\n",
|
||
"zip_files = [f for f in files if \".zip\" in f]\n",
|
||
"\n",
|
||
"#分割各次作业数据\n",
|
||
"with open(tex_file,\"r\",encoding = \"utf8\") as f:\n",
|
||
" tex_data = f.read().strip()\n",
|
||
"tex_data = re.sub(r\"\\t+\",r\" \",tex_data)\n",
|
||
"tex_data = re.sub(r\"\\n{2,}\",\"---split---\",tex_data)\n",
|
||
"homeworklist = tex_data.split(\"---split---\")\n",
|
||
"\n",
|
||
"#读取各次作业首行(文件名)与次行(日期)并组织字典结构\n",
|
||
"homeworkdict = {}\n",
|
||
"for hwk in homeworklist:\n",
|
||
" hwkdata = hwk.strip().split(\"\\n\")\n",
|
||
" id = hwkdata.pop(0)\n",
|
||
" date = hwkdata.pop(0)\n",
|
||
" homeworkdict[id] = {}\n",
|
||
" homeworkdict[id][\"date\"] = date\n",
|
||
" homeworkdict[id][\"usage_data\"] = hwkdata\n",
|
||
"\n",
|
||
"#测试是否每一项都有相应的zip文件与之对应\n",
|
||
"execflag = True\n",
|
||
"for id in homeworkdict:\n",
|
||
" if os.path.join(\"数据导入作业文件\",id+\".zip\") in zip_files:\n",
|
||
" print(\"zip文件在文件夹中:\",id)\n",
|
||
" else:\n",
|
||
" execflag = False\n",
|
||
" print(\"!!!zip文件不在文件夹中:\",id)\n",
|
||
"\n",
|
||
"\n",
|
||
"if execflag:\n",
|
||
" outputstr = \"usages\\n\\n\"\n",
|
||
" for id in homeworkdict:\n",
|
||
" print(\"正在处理%s\"%id)\n",
|
||
" #在zip文件中找到包含正确率数据的文件\n",
|
||
" zip_file = os.path.join(\"数据导入作业文件\",id+\".zip\")\n",
|
||
" zf = zipfile.ZipFile(zip_file)\n",
|
||
" statfiles = [f.filename for f in zf.filelist if \"试题分析\" in f.filename]\n",
|
||
" handinfiles = [f.filename for f in zf.filelist if \"学生成绩\" in f.filename]\n",
|
||
"\n",
|
||
" #生成答题纸区域编号与题目ID的对应\n",
|
||
" correspondence_dict = {}\n",
|
||
" if \"statsfile.xlsx\" in os.listdir(\"临时文件\"):\n",
|
||
" os.remove(\"临时文件/statsfile.xlsx\")\n",
|
||
" extractedpath = Path(zf.extract(statfiles[0]))\n",
|
||
" extractedpath.rename(\"临时文件/statsfile.xlsx\")\n",
|
||
" df = pd.read_excel(\"临时文件/statsfile.xlsx\")\n",
|
||
" problems_indexes = list(df[df.columns[0]][2:])\n",
|
||
"\n",
|
||
" for pind in problems_indexes:\n",
|
||
" for p in homeworkdict[id][\"usage_data\"]:\n",
|
||
" if len(re.findall(\"^\"+pind+\"\\s\",p))>0:\n",
|
||
" correspondence_dict[pind] = p[p.index(\" \")+1:]\n",
|
||
"\n",
|
||
" for sf in [f for f in statfiles]:\n",
|
||
" #读取文件生成区域列表与难度列表\n",
|
||
" classname = gradename+re.findall(r\"高[一二三]([\\d]*?)班\",sf)[0].zfill(2)+\"班\"\n",
|
||
" print(classname)\n",
|
||
" if \"statsfile.xlsx\" in os.listdir(\"临时文件\"):\n",
|
||
" os.remove(\"临时文件/statsfile.xlsx\")\n",
|
||
" extractedpath = Path(zf.extract(sf))\n",
|
||
" extractedpath.rename(\"临时文件/statsfile.xlsx\")\n",
|
||
" df = pd.read_excel(\"临时文件/statsfile.xlsx\")\n",
|
||
" if \"handinfile.xlsx\" in os.listdir(\"临时文件\"):\n",
|
||
" os.remove(\"临时文件/handinfile.xlsx\")\n",
|
||
" extractedpath = Path(zf.extract(sf[:sf.find(\"数学\")]+\"学生成绩.xlsx\"))\n",
|
||
" extractedpath.rename(\"临时文件/handinfile.xlsx\")\n",
|
||
" handindf = pd.read_excel(\"临时文件/handinfile.xlsx\")\n",
|
||
" if str(handindf.iloc[int(len(handindf)*threshold)][\"Unnamed: 4\"]) != \"缺考\":\n",
|
||
" difficulties = list(df[df.columns[9]][2:])\n",
|
||
" problems_indexes = list(df[df.columns[0]][2:])\n",
|
||
" #生成该班级题目ID对应难度列表组成的字典\n",
|
||
" class_difficulty = {}\n",
|
||
" for i in range(len(difficulties)):\n",
|
||
" if problems_indexes[i] in correspondence_dict:\n",
|
||
" if not correspondence_dict[problems_indexes[i]] in class_difficulty:\n",
|
||
" class_difficulty[correspondence_dict[problems_indexes[i]]] = [difficulties[i]]\n",
|
||
" else:\n",
|
||
" class_difficulty[correspondence_dict[problems_indexes[i]]].append(difficulties[i])\n",
|
||
" #添加到输出字符串中\n",
|
||
" for id in class_difficulty:\n",
|
||
" outputstr += id + \"\\n\" + date + \"\\t\" + classname + \"\\t\" + \"\\t\".join([(\"%.3f\" %float(v)) for v in class_difficulty[id]]) + \"\\n\\n\"\n",
|
||
" print(classname, \"有效\")\n",
|
||
" else:\n",
|
||
" print(classname, \"无效\")\n",
|
||
"\n",
|
||
"with open(\"临时文件/自动转换结果.txt\",\"w\",encoding = \"utf8\") as f:\n",
|
||
" f.write(outputstr)\n",
|
||
"with open(\"../文本文件/metadata.txt\",\"w\",encoding = \"utf8\") as f:\n",
|
||
" f.write(outputstr)\n",
|
||
"zf.close()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": []
|
||
}
|
||
],
|
||
"metadata": {
|
||
"kernelspec": {
|
||
"display_name": "mathdept",
|
||
"language": "python",
|
||
"name": "python3"
|
||
},
|
||
"language_info": {
|
||
"codemirror_mode": {
|
||
"name": "ipython",
|
||
"version": 3
|
||
},
|
||
"file_extension": ".py",
|
||
"mimetype": "text/x-python",
|
||
"name": "python",
|
||
"nbconvert_exporter": "python",
|
||
"pygments_lexer": "ipython3",
|
||
"version": "3.10.11"
|
||
},
|
||
"orig_nbformat": 4,
|
||
"vscode": {
|
||
"interpreter": {
|
||
"hash": "ff3c292c316ba85de6f1ad75f19c731e79d694e741b6f515ec18f14996fe48dc"
|
||
}
|
||
}
|
||
},
|
||
"nbformat": 4,
|
||
"nbformat_minor": 2
|
||
}
|