丰富database_tools工具, 在工具v2中增加修改metadata.py工具
This commit is contained in:
parent
cf8d316567
commit
a75fd4260a
|
|
@ -9,6 +9,11 @@ def ReadTextFile(filepath): #读取文本格式的文件
|
||||||
data = f.read()
|
data = f.read()
|
||||||
return data #返回文本格式文件的内容
|
return data #返回文本格式文件的内容
|
||||||
|
|
||||||
|
def SaveTextFile(data,filepath): #写入文本格式的文件
|
||||||
|
with open(filepath,"w",encoding="u8") as f:
|
||||||
|
f.write(data)
|
||||||
|
return filepath #返回文件名
|
||||||
|
|
||||||
def SortDict(adict): #按字典项顺序排序字典
|
def SortDict(adict): #按字典项顺序排序字典
|
||||||
return dict(sorted(adict.items())) #返回排序后的字典
|
return dict(sorted(adict.items())) #返回排序后的字典
|
||||||
|
|
||||||
|
|
@ -313,7 +318,14 @@ def SeperateFirstLine(string): # 切割一个含有换行的字符串
|
||||||
def ObtainDatatoModify(metadatafilepath,fields_dict): #从metadata文件中获取需要修改的综合信息, metadata文件用双回车区分项, 单行的项表示此后的字段, 不小于两行的项中第一行是题目id, 第二行起是要修改的内容.
|
def ObtainDatatoModify(metadatafilepath,fields_dict): #从metadata文件中获取需要修改的综合信息, metadata文件用双回车区分项, 单行的项表示此后的字段, 不小于两行的项中第一行是题目id, 第二行起是要修改的内容.
|
||||||
#fieldsdictpath是字段信息数据库文件路径
|
#fieldsdictpath是字段信息数据库文件路径
|
||||||
data = ReadTextFile(metadatafilepath)
|
data = ReadTextFile(metadatafilepath)
|
||||||
data = re.sub(r"\n[\s\n]*\n","\n\n",data) #去除一些无意义的空格和多余的回车
|
datalines = data.split("\n")
|
||||||
|
data = ""
|
||||||
|
for l in datalines:
|
||||||
|
if l.strip() in fields_dict:
|
||||||
|
data += l + "\n\n"
|
||||||
|
else:
|
||||||
|
data += l + "\n"
|
||||||
|
data = re.sub(r"\n[\s\n]*\n","\n\n",data.strip()) #去除一些无意义的空格和多余的回车
|
||||||
datalist = data.split("\n\n")
|
datalist = data.split("\n\n")
|
||||||
to_modify_list = []
|
to_modify_list = []
|
||||||
currentfield = "NotAField"
|
currentfield = "NotAField"
|
||||||
|
|
@ -406,6 +418,60 @@ def AppendObjData(prodict,objdict,field_id_and_content): #添加目标编号数
|
||||||
print("已于 %s 的 %s 字段执行添加, 编号为 %s, 内容为 %s"%(id,field,objid,objdict[objid]["content"]))
|
print("已于 %s 的 %s 字段执行添加, 编号为 %s, 内容为 %s"%(id,field,objid,objdict[objid]["content"]))
|
||||||
return (id,field,content) #返回三元组: 题号, 字段, 内容
|
return (id,field,content) #返回三元组: 题号, 字段, 内容
|
||||||
|
|
||||||
|
def AppendUsageData(prodict,field_id_and_content): #添加使用记录数据
|
||||||
|
field,id,content = field_id_and_content
|
||||||
|
lines = [re.sub(r"\s+",r"\t",line.strip()) for line in content.split("\n")]
|
||||||
|
pending_list = []
|
||||||
|
for line in lines:
|
||||||
|
if not "FORCE" in line.upper():
|
||||||
|
time_stripped = re.sub(r"^\d{4,}\t","",line) #读取去除时间的数据
|
||||||
|
if time_stripped in "\n".join(prodict[id][field]):
|
||||||
|
print("题号 %s 的 %s 字段, 内容 %s 已存在"%(id,field,line))
|
||||||
|
else:
|
||||||
|
classid = [info for info in line.split("\t") if len(re.findall(r"[班高一二三]",info))>0][0] # 读取班级号
|
||||||
|
if classid in "\n".join(prodict[id][field]):
|
||||||
|
print("班级 %s 在题号为 %s 的题目处已有使用记录, 在pending list中记录"%(classid,id))
|
||||||
|
oldinfo = [usage for usage in prodict[id][field] if classid in usage]
|
||||||
|
pending_list = pending_list + [(id,line,oldinfo)]
|
||||||
|
else:
|
||||||
|
prodict[id][field].append(line)
|
||||||
|
print("已于 %s 的 %s 字段执行添加, 内容为 %s"%(id,field,line))
|
||||||
|
else:
|
||||||
|
line = re.sub(r"\s+",r"\t",re.sub(r"FORCE","",line.upper())).strip()
|
||||||
|
prodict[id][field].append(line)
|
||||||
|
print("已于 %s 的 %s 字段执行强制添加, 内容为 %s"%(id,field,line))
|
||||||
|
output = "usages\n\n"
|
||||||
|
for item in pending_list:
|
||||||
|
id,new,oldlist = item
|
||||||
|
output += id + "\n"
|
||||||
|
output += new+"\tFORCE\n"
|
||||||
|
output += "\n".join(oldlist)+"\n\n"
|
||||||
|
return (field,id,content,output) #返回四元组: 题号, 字段, 内容, 待确定是否要添加的字符串(不含FORCE字样的行为旧结果,含FORCE字样的行为新结果,FORCE是运行后强制添加)
|
||||||
|
|
||||||
|
def ModifyMetadata(prodict,objdict,fieldsdict,metadatafilepath,pendingdatafilepath): #metadata自动修改, 根据字段自适应修改, 参数为题库字典, 目标字典, 字段字典, metadata文本文件路径, 待确定是否替换的内容的存放路径
|
||||||
|
data_to_modify = ObtainDatatoModify(metadatafilepath,fieldsdict)
|
||||||
|
for item in data_to_modify:
|
||||||
|
field = item[0]
|
||||||
|
if field == "NotAField":
|
||||||
|
print("字段名有误")
|
||||||
|
return 1
|
||||||
|
else:
|
||||||
|
method = fieldsdict[field]["Method"]
|
||||||
|
if method == "overwrite":
|
||||||
|
feedback = OverwriteData(prodict,fieldsdict,item)
|
||||||
|
elif method == "append":
|
||||||
|
feedback = AppendData(prodict,fieldsdict,item)
|
||||||
|
elif method == "mutualappend":
|
||||||
|
feedback = AppendMutualData(prodict,item)
|
||||||
|
elif method == "objappend":
|
||||||
|
feedback = AppendObjData(prodict,objdict,item)
|
||||||
|
elif method == "usageappend":
|
||||||
|
feedback = AppendUsageData(prodict,item)
|
||||||
|
outputstring = feedback[3]
|
||||||
|
SaveTextFile(outputstring,pendingdatafilepath)
|
||||||
|
elif method == "fixed":
|
||||||
|
print("字段 %s 不可按此方式修改"%field)
|
||||||
|
return feedback # 已在数据库中修改, 之后需要将数据库写入一次, 返回1表示字段名有误, 返回其他表示成功进行了修改
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
print("数据库工具, import用.")
|
print("数据库工具, import用.")
|
||||||
|
|
@ -0,0 +1,17 @@
|
||||||
|
metadatafilepath = "文本文件/metadata.txt"
|
||||||
|
pendingdatafilepath = "临时文件/pendingmetadata.txt"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
from database_tools import *
|
||||||
|
|
||||||
|
fieldsdict = load_dict("../题库0.3/ProblemFields.json")
|
||||||
|
prodict = load_dict("../题库0.3/Problems.json")
|
||||||
|
objdict = load_dict("../题库0.3/LessonObj.json")
|
||||||
|
|
||||||
|
ModifyMetadata(prodict,objdict,fieldsdict,metadatafilepath,pendingdatafilepath)
|
||||||
|
save_dict(prodict,"../题库0.3/Problem.json")
|
||||||
|
|
||||||
|
|
@ -0,0 +1,50 @@
|
||||||
|
usages
|
||||||
|
|
||||||
|
000003
|
||||||
|
20220825 2023届高三02班 0.909 0.758
|
||||||
|
20220825 2023届高三08班 0.929 0.818
|
||||||
|
20220825 2023届高三10班 0.963
|
||||||
|
20220826 2023届高三11班 0.543 0.213
|
||||||
|
|
||||||
|
ans
|
||||||
|
1
|
||||||
|
$2$
|
||||||
|
|
||||||
|
2
|
||||||
|
正好
|
||||||
|
|
||||||
|
objs
|
||||||
|
123
|
||||||
|
K0102001B
|
||||||
|
|
||||||
|
opp
|
||||||
|
121
|
||||||
|
23456
|
||||||
|
|
||||||
|
|
||||||
|
id
|
||||||
|
000008
|
||||||
|
000009
|
||||||
|
|
||||||
|
origin
|
||||||
|
12345
|
||||||
|
123456
|
||||||
|
|
||||||
|
unrelated
|
||||||
|
3
|
||||||
|
4
|
||||||
|
|
||||||
|
unrelated
|
||||||
|
4
|
||||||
|
3
|
||||||
|
|
||||||
|
tags
|
||||||
|
5
|
||||||
|
哈哈
|
||||||
|
六六
|
||||||
|
|
||||||
|
usages
|
||||||
|
|
||||||
|
000003
|
||||||
|
20220825 2023届高三08班 0.929 0.818 FORCE
|
||||||
|
20220824 2023届高三08班 0.939 0.818
|
||||||
Reference in New Issue