丰富database_tools工具, 在工具v2中增加修改metadata.py工具

This commit is contained in:
wangweiye7840 2023-06-26 15:27:07 +08:00
parent cf8d316567
commit a75fd4260a
3 changed files with 134 additions and 1 deletions

View File

@ -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用.")

View File

@ -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")

View File

@ -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