2024-09-19 11:33:17 +08:00
|
|
|
|
# -*- encoding:utf-8 -*-
|
2024-08-29 16:37:09 +08:00
|
|
|
|
import json
|
2024-09-09 15:21:07 +08:00
|
|
|
|
|
2024-09-19 11:33:17 +08:00
|
|
|
|
def find_keys_by_value(target_value, json_data):
|
|
|
|
|
# 查找完全匹配目标值的键,如果没有找到,检查字符串值是否包含目标值
|
|
|
|
|
matched_keys = [k for k, v in json_data.items() if v == target_value]
|
|
|
|
|
if not matched_keys:
|
|
|
|
|
matched_keys = [k for k, v in json_data.items() if isinstance(v, str) and v.startswith(target_value)]
|
|
|
|
|
print(matched_keys)
|
|
|
|
|
return matched_keys
|
2024-09-09 15:21:07 +08:00
|
|
|
|
|
2024-09-19 11:33:17 +08:00
|
|
|
|
#若match_keys中有3.1,那么以3.1为前缀的键都会被找出来,如3.1.1 3.1.2...
|
|
|
|
|
def find_keys_with_prefix(key_prefix, json_data):
|
|
|
|
|
# 查找以特定前缀开始的所有键
|
|
|
|
|
subheadings = [k for k in json_data if k.startswith(key_prefix)]
|
|
|
|
|
return subheadings
|
2024-09-09 15:21:07 +08:00
|
|
|
|
|
2024-09-19 11:33:17 +08:00
|
|
|
|
def extract_json(data, target_values):
|
|
|
|
|
results = {}
|
|
|
|
|
for target_value in target_values:
|
|
|
|
|
matched_keys = find_keys_by_value(target_value, data)
|
|
|
|
|
for key in matched_keys:
|
|
|
|
|
key_and_subheadings = find_keys_with_prefix(key, data)
|
|
|
|
|
for subkey in key_and_subheadings:
|
|
|
|
|
if "." in subkey:
|
|
|
|
|
parent_key = subkey.rsplit('.', 1)[0]
|
|
|
|
|
top_level_key = parent_key.split('.')[0] + '.'
|
|
|
|
|
# 特别处理定标相关的顶级键,确保不会重复添加其他键
|
|
|
|
|
if top_level_key not in results:
|
|
|
|
|
results[top_level_key] = target_value
|
|
|
|
|
# 添加或更新父级键
|
|
|
|
|
if parent_key not in results:
|
|
|
|
|
if parent_key in data:
|
|
|
|
|
results[parent_key] = data[parent_key]
|
|
|
|
|
# 添加当前键
|
|
|
|
|
results[subkey] = data[subkey]
|
|
|
|
|
return results
|
2024-09-09 15:21:07 +08:00
|
|
|
|
|
2024-09-19 11:33:17 +08:00
|
|
|
|
# 示例 JSON 数据
|
2024-09-09 15:21:07 +08:00
|
|
|
|
data = {
|
2024-09-19 11:33:17 +08:00
|
|
|
|
"3.1": "投标文件的组成",
|
|
|
|
|
"3.1.1": "投标文件应包括下列内容:(1)投标函及投标函附录;(2)法定代表人身份证明;(3)联合体协议书(如有);(4)投标保证金;(5)监理服务费投标报价表;(6)监理大纲;(7)监理机构;(8)资格审查资料;(9)投标人须知前附表规定的其他材料。",
|
|
|
|
|
"3.1.2": "招标公告规定不接受联合体投标的,或投标人没有组成联合体的,投标文件不包括本章第3.1.1项第(3)目所指的联合体协议书。",
|
|
|
|
|
"3.1.3": "投标人须知前附表规定不允许分包的,投标文件不包括本章第3.1.1项第(8)目所指的拟分包项目情况表。",
|
|
|
|
|
"3.2": "投标报价",
|
|
|
|
|
"3.2.1": "投标报价是投标人按照招标文件的要求完成投标人须知前附表规定监理服务阶段监理工作所需的费用。",
|
|
|
|
|
"3.2.2": "招标人是否设置最高投标限价见投标人须知前附表,如采用设置了最高投标限价,投标人在投标书中的报价应在最高投标限价范围内,最高投标限价在招标文件中或最迟在投标截止时间前15日,通过“电子交易平台”以书面形式发给所有下载招标文件的投标人。",
|
|
|
|
|
"3.2.3": "投标人应按照招标文件规定的格式和内容计算投标报价。",
|
|
|
|
|
"3.2.4": "其他报价规定见投标人须知前附表。",
|
|
|
|
|
"3.3": "投标有效期",
|
|
|
|
|
"3.3.1": "在投标人须知前附表规定的投标有效期内,投标人不得要求撤销或修改其投标文件。",
|
|
|
|
|
"3.3.2": "出现特殊情况需要延长投标有效期的,招标人以书面形式通知所有投标人延长投标有效期。投标人同意延长的,应相应延长其投标保证金的有效期,但不得要求或被允许修改或撤销其投标文件;投标人拒绝延长的,其投标失效,但投标人有权收回其投标保证金。",
|
|
|
|
|
"3.4": "投标保证金",
|
|
|
|
|
"3.4.1": "投标人须知前附表规定提交投标保证金的,投标人在递交投标文件的同时,应按投标人须知前附表规定的形式、金额、递交截止时间、递交方式提交投标保证金,并作为其投标文件的组成部分。联合体投标的,其投标保证金由牵头人递交,并应符合投标人须知前附表的规定。联合体其他成员提交保证金的,保证金无效。投标保证金有效期均应与投标有效期一致。招标人如果按本章第3.3.2项的规定延长了投标有效期,则投标保证金有效期也相应延长。",
|
|
|
|
|
"3.4.2": "招标人与中标人签订监理合同后5日内,向中标人和未中标的投标人退还投标保证金及银行同期存款利息;如果要求中标人提供履约担保的,中标人的投标保证金在中标人提交了履约担保并签订监理合同后5日内退还。",
|
|
|
|
|
"3.4.3": "投标保证金有效期与投标文件有效期一致,招标人按规定延长投标文件有效期的,投标保证金按本章投标人须知第3.3款的规定执行。",
|
|
|
|
|
"3.4.4": "有下列情形之一的,投标保证金将不予退还:(1)投标人在规定的投标有效期内撤销或修改其投标文件;(2)中标人在收到中标通知书后,无正当理由拒签合同协议书或未按招标文件规定提交履约担保;(3)中标人在签订合同时向招标人提出附加条件;(4)推荐的中标候选人在中标通知书发出前放弃中标;(5)投标人不接受依据评标办法的规定对其投标文件中细微偏差进行澄清和补正;(6)投标人存在以他人名义投标、与他人串通投标、以行贿手段谋取中标、弄虚作假等行为。",
|
|
|
|
|
"3.5": "资格审查资料",
|
|
|
|
|
"3.5.1": "投标人应按招标文件第八章“投标文件格式”中规定的表格内容填写资格审查表,并按各资格审查表的具体要求提供相关证件及证明材料。招标文件中提到的“近3年”除有特别说明外,指从投标截止日往前推算的3年,如投标截止日为2018年2月1日,则近3年是指2015年2月1日至2018年1月31日。其他情况依此类推。",
|
|
|
|
|
"3.5.2": "“投标人近年财务状况表”具体年份要求见投标人须知前附表。财务状况的年份要求指的是年度。如投标截止日如在当年6月30日以前,则近年指上上个年度往前推算的3年,例如投标截止日为2018年5月30日,近三年是指2014年度、2015年度、2016年度。投标截止日如在当年6月30日以后,则近三年是指上个年度往前推算的3年,例如投标截止日为2018年7月30日,近三年是指2015年度、2016年度、2017年度。",
|
|
|
|
|
"3.5.3": "“投标人近年已完工的类似工程一览表”具体年份要求见投标人须知前附表。",
|
|
|
|
|
"3.5.4": "招标公告规定接受联合体投标的,本章第3.5.1项规定的表格和资料应包括联合体各方相关情况。",
|
|
|
|
|
"3.6": "投标文件的编制",
|
|
|
|
|
"3.6.1": "投标文件应按“投标文件格式”进行编写,如有必要,可以增加附页,作为投标文件的组成部分。其中,投标函附录在满足招标文件实质性要求的基础上,可以提出比招标文件要求更有利于招标人的承诺。",
|
|
|
|
|
"3.6.2": "投标文件应当对招标文件有关工期、投标有效期、质量要求、技术标准和要求、招标范围等实质性内容作出响应。",
|
|
|
|
|
"3.6.3": "投标文件制作(1)投标文件由投标人使用“市电子交易平台”自带的“投标文件制作工具”制作生成。(2)投标人在编制投标文件时应当建立分级目录,并按照标签提示导入相关内容。(3)投标文件中证明资料的“复印件”均为“原件的扫描件”,(4)投标文件中的已标价工程量清单数据文件应与招标人提供的工程量清单数据文件格式一致。(5)第八章投标文件格式文件要求盖单位章和(或)签字的地方,投标人均应使用CA数字证书加盖投标人的单位电子印章和(或)法定代表人的个人电子印章或电子签名章。联合体投标的,投标文件由联合体牵头人按上述规定加盖联合体牵头人单位电子印章和(或)法定代表人的个人电子印章或电子签名章。(6)投标文件制作完成后,将生成一份加密的电子投标文件和一份不加密的电子投标文件。(7)投标人将不加密的电子投标文件复制到一张U盘中,U盘表面粘贴“标签贴”,并将项目名称、招标编号、投标人名称等信息填写在“标签贴”上。(8)投标文件制作的具体方法详见“投标文件制作工具”中的帮助文档。",
|
|
|
|
|
"3.6.4": "投标文件份数投标文件包括加密的电子投标文件和不加密的电子投标文件(U盘备份)各一份。投标人中标后向招标人另行提供与投标时相同的纸质版投标文件份数见投标人须知前附表。",
|
|
|
|
|
"4.": "投标",
|
|
|
|
|
"4.1": "投标文件的密封与标记",
|
|
|
|
|
"4.1.1": "投标文件的加密加密的电子投标文件应按照本章第3.6.3项要求制作并加密,未按要求加密的电子投标文件,招标人(“市电子交易平台”)将拒收并提示。",
|
|
|
|
|
"4.1.2": "不加密的电子投标文件的密封和标识(1)不加密的电子投标文件(U盘备份)应单独密封包装,并在封套的封口处加贴封条。(2)不加密的电子投标文件(U盘备份)封套上应写明的其他内容见投标人须知前附表。3未按本章第4.1.2项要求密封和加写标记的投标文件,招标人将拒收。",
|
|
|
|
|
"4.2": "投标文件的递交",
|
|
|
|
|
"4.2.1": "在招标公告规定的投标截止时间前,投标人可以修改或撤回已递交的投标文件。",
|
|
|
|
|
"4.2.2": "投标人对加密的电子投标文件进行撤回的,在“市电子交易平台”直接进行撤回操作;投标人对不加密的电子投标文件(U盘备份)进行撤回的,应以书面形式通知招标人,撤回的书面通知应加盖投标人的单位章或由法定代表人或其委托代理人签字(指亲笔签名),招标人收到书面通知后,向投标人出具签收凭证。",
|
|
|
|
|
"4.2.3": "投标人撤回投标文件的,招标人自收到投标人书面撤回通知之日按公共资源交易中心退还已收取的投标保证金。",
|
|
|
|
|
"4.2.4": "投标人修改投标文件的,应当先按本章第4.2项的规定撤回投标文件,再使用“投标文件制作工具”制作成完整的投标文件,并按照本章第3条、第4条规定进行编制、密封、标记和递交。",
|
|
|
|
|
"4.2.5": "任何情况下,投标人都有义务保证其递交的加密的电子投标文件和不加密的电子投标文件(U盘备份)内容一致,否则造成的后果由投标人自行承担。",
|
|
|
|
|
"4.3": "投标文件的修改与撤回",
|
|
|
|
|
"4.3.1": "在送交投标文件截止期以前,投标人可以更改或撤回投标文件,并按本章第项的规定操作。",
|
|
|
|
|
"4.3.2": "送交投标文件截止期以后,投标文件不得更改。需对投标文件做出澄清时,必须按照本须知第23条的规定办理。",
|
|
|
|
|
"4.3.4": "如果在送交投标文件截止期以后且投标文件有效期内撤回投标文件,则按本须知第3.4.4款的规定不予退还其投标担保。",
|
2024-09-09 15:21:07 +08:00
|
|
|
|
}
|
|
|
|
|
|
2024-09-19 11:33:17 +08:00
|
|
|
|
# 目标值
|
|
|
|
|
target_values = ["投标文件","投标"]
|
|
|
|
|
|
|
|
|
|
# 提取数据
|
|
|
|
|
extracted_data = extract_json(data, target_values)
|
|
|
|
|
|
|
|
|
|
# 打印结果
|
|
|
|
|
print(json.dumps(extracted_data, indent=4, ensure_ascii=False))
|