丰富database_tools工具, 在工具v2中增加修改metadata.py工具
This commit is contained in:
parent
cf8d316567
commit
a75fd4260a
|
|
@ -9,6 +9,11 @@ def ReadTextFile(filepath): #读取文本格式的文件
|
|||
data = f.read()
|
||||
return data #返回文本格式文件的内容
|
||||
|
||||
def SaveTextFile(data,filepath): #写入文本格式的文件
|
||||
with open(filepath,"w",encoding="u8") as f:
|
||||
f.write(data)
|
||||
return filepath #返回文件名
|
||||
|
||||
def SortDict(adict): #按字典项顺序排序字典
|
||||
return dict(sorted(adict.items())) #返回排序后的字典
|
||||
|
||||
|
|
@ -313,7 +318,14 @@ def SeperateFirstLine(string): # 切割一个含有换行的字符串
|
|||
def ObtainDatatoModify(metadatafilepath,fields_dict): #从metadata文件中获取需要修改的综合信息, metadata文件用双回车区分项, 单行的项表示此后的字段, 不小于两行的项中第一行是题目id, 第二行起是要修改的内容.
|
||||
#fieldsdictpath是字段信息数据库文件路径
|
||||
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")
|
||||
to_modify_list = []
|
||||
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"]))
|
||||
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__":
|
||||
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