获取小闲平台使用数据new基本可以使用

This commit is contained in:
wangweiye7840 2024-03-21 12:44:26 +08:00
parent de4fabb00e
commit 21c0ed75ef
3 changed files with 109 additions and 106 deletions

View File

@ -26,16 +26,16 @@ class Ui_Form(object):
Form.resize(727, 604) Form.resize(727, 604)
self.pushButton_file = QPushButton(Form) self.pushButton_file = QPushButton(Form)
self.pushButton_file.setObjectName(u"pushButton_file") self.pushButton_file.setObjectName(u"pushButton_file")
self.pushButton_file.setGeometry(QRect(624, 70, 81, 24)) self.pushButton_file.setGeometry(QRect(620, 70, 91, 24))
self.lineEdit_threshold = QLineEdit(Form) self.lineEdit_threshold = QLineEdit(Form)
self.lineEdit_threshold.setObjectName(u"lineEdit_threshold") self.lineEdit_threshold.setObjectName(u"lineEdit_threshold")
self.lineEdit_threshold.setGeometry(QRect(620, 30, 81, 20)) self.lineEdit_threshold.setGeometry(QRect(620, 30, 91, 20))
self.label = QLabel(Form) self.label = QLabel(Form)
self.label.setObjectName(u"label") self.label.setObjectName(u"label")
self.label.setGeometry(QRect(623, 10, 61, 20)) self.label.setGeometry(QRect(623, 10, 61, 20))
self.pushButton_folder = QPushButton(Form) self.pushButton_folder = QPushButton(Form)
self.pushButton_folder.setObjectName(u"pushButton_folder") self.pushButton_folder.setObjectName(u"pushButton_folder")
self.pushButton_folder.setGeometry(QRect(624, 110, 81, 24)) self.pushButton_folder.setGeometry(QRect(620, 110, 91, 24))
self.pushButton_exec = QPushButton(Form) self.pushButton_exec = QPushButton(Form)
self.pushButton_exec.setObjectName(u"pushButton_exec") self.pushButton_exec.setObjectName(u"pushButton_exec")
self.pushButton_exec.setGeometry(QRect(620, 270, 91, 75)) self.pushButton_exec.setGeometry(QRect(620, 270, 91, 75))
@ -61,6 +61,9 @@ class Ui_Form(object):
self.checkBox = QCheckBox(Form) self.checkBox = QCheckBox(Form)
self.checkBox.setObjectName(u"checkBox") self.checkBox.setObjectName(u"checkBox")
self.checkBox.setGeometry(QRect(620, 230, 91, 20)) self.checkBox.setGeometry(QRect(620, 230, 91, 20))
self.pushButton_validcheck = QPushButton(Form)
self.pushButton_validcheck.setObjectName(u"pushButton_validcheck")
self.pushButton_validcheck.setGeometry(QRect(620, 160, 91, 51))
self.retranslateUi(Form) self.retranslateUi(Form)
@ -80,5 +83,6 @@ class Ui_Form(object):
___qtablewidgetitem2 = self.tableWidget.horizontalHeaderItem(2) ___qtablewidgetitem2 = self.tableWidget.horizontalHeaderItem(2)
___qtablewidgetitem2.setText(QCoreApplication.translate("Form", u"\u4e2d\u4f4d\u626b\u63cf\u65e5\u671f", None)); ___qtablewidgetitem2.setText(QCoreApplication.translate("Form", u"\u4e2d\u4f4d\u626b\u63cf\u65e5\u671f", None));
self.checkBox.setText(QCoreApplication.translate("Form", u"Append\u6a21\u5f0f", None)) self.checkBox.setText(QCoreApplication.translate("Form", u"Append\u6a21\u5f0f", None))
self.pushButton_validcheck.setText(QCoreApplication.translate("Form", u"\u68c0\u67e5\u6709\u6548\u6027", None))
# retranslateUi # retranslateUi

View File

@ -2,6 +2,7 @@ from PySide6.QtWidgets import QWidget, QApplication, QFileDialog, QTableWidgetIt
from PySide6.QtGui import QColor from PySide6.QtGui import QColor
from Ui_获取小闲平台使用数据new import Ui_Form from Ui_获取小闲平台使用数据new import Ui_Form
from database_tools import * from database_tools import *
import shutil,zipfile
def getFilename(string): def getFilename(string):
@ -16,19 +17,26 @@ def getDate(string):
return "" return ""
class MyWindow(QWidget,Ui_Form): class MyWindow(QWidget,Ui_Form):
def __init__(self): def __init__(self):
super().__init__() super().__init__()
self.setupUi(self) self.setupUi(self)
self.bind() self.bind()
def bind(self): def bind(self):
self.tempdir = "临时文件/zips"
self.statsfilename = "小题分_按学号数学.xlsx"
self.answersheetseekingpath = "../备课组"
self.lineEdit_threshold.setText("0.75") self.lineEdit_threshold.setText("0.75")
self.tableWidget.setColumnWidth(0,200) self.tableWidget.setColumnWidth(0,200)
self.tableWidget.setColumnWidth(1,280) self.tableWidget.setColumnWidth(1,280)
self.tableWidget.setColumnWidth(2,80) self.tableWidget.setColumnWidth(2,80)
self.pushButton_file.clicked.connect(self.getFilePath) self.pushButton_file.clicked.connect(self.getFilePath)
self.pushButton_folder.clicked.connect(self.getDirPath) self.pushButton_folder.clicked.connect(self.getDirPath)
self.pushButton_validcheck.clicked.connect(self.checkpathanddate)
self.pushButton_exec.clicked.connect(self.exec) self.pushButton_exec.clicked.connect(self.exec)
self.singlefile = True self.tablevalid = True
def getFilePath(self): #选取文件并放置在tableWidget的第一行 def getFilePath(self): #选取文件并放置在tableWidget的第一行
@ -36,7 +44,7 @@ class MyWindow(QWidget,Ui_Form):
pathlist = QFileDialog.getOpenFileName(self,"选择文件",".","zip文件(*.zip);;所有文件(*)") pathlist = QFileDialog.getOpenFileName(self,"选择文件",".","zip文件(*.zip);;所有文件(*)")
self.zipfilepath = pathlist[0] self.zipfilepath = pathlist[0]
self.tableWidget.setItem(0,0,QTableWidgetItem(pathlist[0])) self.tableWidget.setItem(0,0,QTableWidgetItem(pathlist[0]))
self.singlefile = True # self.singlefile = True
filename = getFilename(pathlist[0]) filename = getFilename(pathlist[0])
self.tableWidget.setItem(0,1,QTableWidgetItem(filename)) self.tableWidget.setItem(0,1,QTableWidgetItem(filename))
self.tableWidget.setItem(0,2,QTableWidgetItem(getDate(pathlist[0]))) self.tableWidget.setItem(0,2,QTableWidgetItem(getDate(pathlist[0])))
@ -48,7 +56,7 @@ class MyWindow(QWidget,Ui_Form):
def getDirPath(self): #选取文件夹中的所有符合答题纸特征的.zip文件并放置在tableWidget中 def getDirPath(self): #选取文件夹中的所有符合答题纸特征的.zip文件并放置在tableWidget中
dirpath = QFileDialog.getExistingDirectory(self,"选择文件夹") dirpath = QFileDialog.getExistingDirectory(self,"选择文件夹")
self.filelist = [os.path.join(dirpath,f) for f in os.listdir(dirpath) if ".zip" in f and re.findall(r"\d{21}",f)!=[]] self.filelist = [os.path.join(dirpath,f) for f in os.listdir(dirpath) if ".zip" in f and re.findall(r"\d{21}",f)!=[]]
self.singlefile = False # self.singlefile = False
count = 0 count = 0
for f in self.filelist: for f in self.filelist:
if count + 1 > self.tableWidget.rowCount(): if count + 1 > self.tableWidget.rowCount():
@ -57,109 +65,87 @@ class MyWindow(QWidget,Ui_Form):
self.tableWidget.setItem(count,1,QTableWidgetItem(getFilename(f))) self.tableWidget.setItem(count,1,QTableWidgetItem(getFilename(f)))
self.tableWidget.setItem(count,2,QTableWidgetItem(getDate(f))) self.tableWidget.setItem(count,2,QTableWidgetItem(getDate(f)))
count += 1 count += 1
def exec(self):
if self.singlefile:
self.execsinglefile()
else:
self.execmultifile()
def execmultifile(self): #待修改 def checkpathanddate(self): #检查文件名和日期是否有效, 文件名无效标黄色, 日期无效标红色
files = self.filelist if not float(self.lineEdit_threshold.text()) >= 0 or not float(self.lineEdit_threshold.text()) <= 1:
datedfiles = [] self.lineEdit_threshold.setStyleSheet("background-color: red;")
tempdir = "临时文件/zips" self.tablevalid = False
statsfilename = "小题分_按学号数学.xlsx" self.using_rows = []
answersheetseekingpath = "../备课组" self.tableWidget.clearSelection()
glossoutput = "" for t in range(self.tableWidget.rowCount()):
threshold = float(self.lineEdit_threshold.text()) for i in range(3):
for f in files: self.tableWidget.item(t,i).setBackground(QColor("transparent"))
fpath = os.path.join(directory,f) for t in range(self.tableWidget.rowCount()):
if len(re.findall(r"\(\d{8}\)",f)) == 0: if re.findall(r"\d{21}",self.tableWidget.item(t,0).text()) == [] or not len(self.tableWidget.item(t,2).text().strip()) == 8:
print(f"文件 {f} 未标注日期.") for i in range(3):
self.tableWidget.item(t,i).setBackground(QColor("yellow"))
else: else:
datedfiles.append(fpath) self.using_rows.append(t)
for zipfpath in datedfiles: for row in range(self.tableWidget.rowCount()):
try: date = self.tableWidget.item(row,2).text()
try: if not len(date.strip()) == 8:
shutil.rmtree(tempdir) self.tableWidget.item(row,2).setBackground(QColor("red"))
except:
pass
makedir(tempdir)
date = re.findall(r"\((\d{8})\)",zipfpath)[0]
xiaoxianpid = ParseZipname(zipfpath)
paperinfo = FindPaper(xiaoxianpid, answersheetseekingpath)
gradename = paperinfo[1]
idlist = paperinfo[2]
zf = zipfile.ZipFile(zipfpath)
zf.extractall(tempdir) #解压zip文件中的所有内容到tempdir
statsfilepathlist = FindFile(tempdir,statsfilename)
validcols,marks = generateColIndexandMarks(statsfilepathlist,statsfilename,paperinfo)
dfcurrent = pd.read_excel(os.path.join(statsfilepathlist[0],statsfilename))
correspondence_dict = generateIDtoUsageCorrespondence(idlist,validcols,dfcurrent.iloc[1,validcols])
output = CalculateUsages(statsfilepathlist,statsfilename,gradename,threshold,marks,correspondence_dict,validcols,date)
if CheckUsagesValidity(output) == 0:
glossoutput += output
else:
print(f"{zipfpath} 数据有误, 可能需要检查每一题的满分数据")
self.label_filepath.setText(f"{zipfpath} 数据有误, 可能需要检查每一题的满分数据")
print(f"文件 {zipfpath} 处理完成")
except:
print(f"{zipfpath} 操作中有错误, 需要检查源数据")
self.label_filepath.setText(f"{zipfpath} 操作中有错误, 需要检查源数据")
SaveTextFile(glossoutput,"文本文件/metadata.txt")
os.system("code 文本文件/metadata.txt")
# print(datedfiles)
def execsinglefile(self): #待修改 def exec(self): #执行操作并将使用数据汇入metadata.txt
self.tableWidget.clearSelection() self.checkpathanddate()
self.tableWidget.item(0,2).setBackground(QColor("transparent")) if len(self.using_rows) >= 2:
date = self.tableWidget.item(0,2).text() SaveTextFile("","文本文件/metadata.txt")
threshold = float(self.lineEdit_threshold.text()) for row in self.using_rows:
if not len(date.strip()) == 8: date = self.tableWidget.item(row,2).text()
self.tableWidget.item(0,2).setBackground(QColor("red")) threshold = float(self.lineEdit_threshold.text())
elif not threshold >= 0 or not threshold <= 1: output = self.generateUsingInfo(zipfilepath=self.tableWidget.item(0,0).text(),threshold=threshold,date=date)
self.lineEdit_threshold.setText("阈值有误") if output == 1 or CheckUsagesValidity(output) != 0:
# else: for i in range(3):
# tempdir = "临时文件/zips" self.tableWidget.item(row,i).setBackground(QColor("red"))
# statsfilename = "小题分_按学号数学.xlsx" if output == 1:
# answersheetseekingpath = "../备课组" print(f"{self.tableWidget.item(row,1).text()} 有问题, 未能生成使用数据")
# try: else:
# shutil.rmtree(tempdir) print(f"{self.tableWidget.item(row,1).text()} 满分设置有误, 请检查")
# except: else:
# pass for i in range(3):
# makedir(tempdir) self.tableWidget.item(row,i).setBackground(QColor("green"))
# xiaoxianpid = ParseZipname(self.zipfilepath) print(f"{self.tableWidget.item(row,1).text()} 使用数据生成成功")
# paperinfo = FindPaper(xiaoxianpid, answersheetseekingpath) if not self.checkBox.isChecked() and len(self.using_rows) == 1:
# gradename = paperinfo[1] SaveTextFile(output,"文本文件/metadata.txt")
# idlist = paperinfo[2] else:
AppendTextFile(output,"文本文件/metadata.txt")
# zf = zipfile.ZipFile(self.zipfilepath) os.system("code 文本文件/metadata.txt")
# zf.extractall(tempdir) #解压zip文件中的所有内容到tempdir
# # papertype = CheckPaperType(tempdir,statsfilename)
# statsfilepathlist = FindFile(tempdir,statsfilename)
# validcols,marks = generateColIndexandMarks(statsfilepathlist,statsfilename,paperinfo)
# dfcurrent = pd.read_excel(os.path.join(statsfilepathlist[0],statsfilename))
# correspondence_dict = generateIDtoUsageCorrespondence(idlist,validcols,dfcurrent.iloc[1,validcols])
# output = CalculateUsages(statsfilepathlist,statsfilename,gradename,threshold,marks,correspondence_dict,validcols,date)
# if CheckUsagesValidity(output) == 0:
# if not self.checkBox_appendflag.isChecked():
# SaveTextFile(output,"文本文件/metadata.txt")
# print("数据文件已输出至metadata.txt")
# self.label_filepath.setText("数据文件已输出至metadata.txt")
# os.system("code 文本文件/metadata.txt")
# else:
# AppendTextFile("\n\n"+output,"文本文件/metadata.txt")
# print("数据文件已添加至metadata.txt")
# self.label_filepath.setText("数据文件已添加至metadata.txt")
# os.system("code 文本文件/metadata.txt")
# else:
# print("数据有误, 可能需要检查每一题的满分数据") def generateUsingInfo(self,zipfilepath,threshold,date): #根据zipfilepath文件路径, threshold最低提交比例阈值, date日期产生对应一张答题纸的使用记录
# self.label_filepath.setText("数据有误, 可能需要检查每一题的满分数据") try:
shutil.rmtree(self.tempdir)
except:
pass
makedir(self.tempdir)
try:
xiaoxianpid = ParseZipname(zipfilepath)
paperinfo = FindPaper(xiaoxianpid, self.answersheetseekingpath)
gradename = paperinfo[1]
idlist = paperinfo[2]
# print(paperinfo)
zf = zipfile.ZipFile(zipfilepath)
zf.extractall(self.tempdir) #解压zip文件中的所有内容到tempdir
# # papertype = CheckPaperType(tempdir,statsfilename)
statsfilepathlist = FindFile(self.tempdir,self.statsfilename)
validcols,marks = generateColIndexandMarks(statsfilepathlist,self.statsfilename,paperinfo)
dfcurrent = pd.read_excel(os.path.join(statsfilepathlist[0],self.statsfilename))
correspondence_dict = generateIDtoUsageCorrespondence(idlist,validcols,dfcurrent.iloc[1,validcols])
output = CalculateUsages(statsfilepathlist,self.statsfilename,gradename,threshold,marks,correspondence_dict,validcols,date)
return output #返回由usages开始的使用记录文本
except:
return 1 #无法生成就返回1

View File

@ -16,9 +16,9 @@
<widget class="QPushButton" name="pushButton_file"> <widget class="QPushButton" name="pushButton_file">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>624</x> <x>620</x>
<y>70</y> <y>70</y>
<width>81</width> <width>91</width>
<height>24</height> <height>24</height>
</rect> </rect>
</property> </property>
@ -31,7 +31,7 @@
<rect> <rect>
<x>620</x> <x>620</x>
<y>30</y> <y>30</y>
<width>81</width> <width>91</width>
<height>20</height> <height>20</height>
</rect> </rect>
</property> </property>
@ -52,9 +52,9 @@
<widget class="QPushButton" name="pushButton_folder"> <widget class="QPushButton" name="pushButton_folder">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>624</x> <x>620</x>
<y>110</y> <y>110</y>
<width>81</width> <width>91</width>
<height>24</height> <height>24</height>
</rect> </rect>
</property> </property>
@ -128,6 +128,19 @@
<string>Append模式</string> <string>Append模式</string>
</property> </property>
</widget> </widget>
<widget class="QPushButton" name="pushButton_validcheck">
<property name="geometry">
<rect>
<x>620</x>
<y>160</y>
<width>91</width>
<height>51</height>
</rect>
</property>
<property name="text">
<string>检查有效性</string>
</property>
</widget>
</widget> </widget>
<resources/> <resources/>
<connections/> <connections/>