zbparse/flask_app/main/投标人须知正文提取指定内容.py

85 lines
4.0 KiB
Python
Raw Normal View History

2024-10-30 18:08:46 +08:00
# script1.py
2024-08-29 16:37:09 +08:00
import json
import re
2024-10-30 18:08:46 +08:00
from common import (
compare_headings,
preprocess_data,
transform_json,
post_process,
process_nested_data,
)
# 对于每个 target_value 元素,如果有完美匹配 json_data 中的键,那就加入这个完美匹配的键名,否则,把全部模糊匹配到的键名都加入
2024-08-29 16:37:09 +08:00
def find_keys_by_value(target_value, json_data):
2024-09-30 16:23:39 +08:00
matched_keys = [k for k, v in json_data.items() if v == target_value] # 首先检查 JSON 中的每个键值对,如果值完全等于目标值,则将这些键收集起来。
2024-08-29 16:37:09 +08:00
if not matched_keys:
2024-10-30 18:08:46 +08:00
matched_keys = [
k
for k, v in json_data.items()
if isinstance(v, str) and v.startswith(target_value)
] # 如果没有找到完全匹配的键,它会检查字符串类型的值是否以目标值开头,并收集这些键。
return matched_keys # 例如:[3.1,3.1.1,3.1.2,3.2...]
# 定义查找以特定前缀开始的键的函数,例如:若 match_keys 中有 3.1,那么以 3.1 为前缀的键都会被找出来,如 3.1.1、3.1.2...
2024-08-29 16:37:09 +08:00
def find_keys_with_prefix(key_prefix, json_data):
subheadings = [k for k in json_data if k.startswith(key_prefix)]
return subheadings
2024-10-30 18:08:46 +08:00
# 从完整的 JSON 文件中读取所需数据,例如:投标、评标
2024-08-29 16:37:09 +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:
2024-10-30 18:08:46 +08:00
parent_key = subkey.rsplit(".", 1)[0]
top_level_key = parent_key.split(".")[0] + "."
2024-09-30 17:52:59 +08:00
# 特别处理定标相关的顶级键,确保不会重复添加其他键
if top_level_key not in results:
2024-09-30 17:52:59 +08:00
results[top_level_key] = target_value
2024-08-29 16:37:09 +08:00
# 添加或更新父级键
if parent_key not in results:
if parent_key in data:
results[parent_key] = data[parent_key]
2024-09-30 17:52:59 +08:00
# 添加当前键
results[subkey] = data[subkey]
2024-08-29 16:37:09 +08:00
return results
2024-10-30 18:08:46 +08:00
# 读取 JSON 数据,提取内容,转换结构,并返回结果
def extract_from_notice(clause_path, type):
2024-08-29 16:37:09 +08:00
if type == 1:
2024-10-30 18:08:46 +08:00
target_values = ["投标", "投标文件", "响应文件"]
2024-08-29 16:37:09 +08:00
elif type == 2:
2024-10-30 18:08:46 +08:00
target_values = ["开标", "评标", "定标", "磋商程序", "中标"]
2024-08-29 16:37:09 +08:00
elif type == 3:
target_values = ["重新招标、不再招标和终止招标", "重新招标", "不再招标", "终止招标"]
elif type == 4:
2024-09-30 16:23:39 +08:00
target_values = ["评标"] # 测试
2024-08-29 16:37:09 +08:00
else:
2024-09-30 16:23:39 +08:00
raise ValueError(
2024-10-30 18:08:46 +08:00
"Invalid type specified. Use 1 for '投标文件, 投标' or 2 for '开标, 评标, 定标' or 3 for '重新招标'"
)
with open(clause_path, "r", encoding="utf-8") as file:
2024-08-29 16:37:09 +08:00
data = json.load(file)
2024-10-30 18:08:46 +08:00
extracted_data = extract_json(data, target_values) # 读取 JSON
# print(json.dumps(extracted_data, ensure_ascii=False, indent=4))
sorted_data = preprocess_data(extracted_data) # 对输入的字典 data 的键进行预处理和排序
transformed_data = transform_json(sorted_data)
2024-10-30 18:08:46 +08:00
# print(json.dumps(transformed_data, ensure_ascii=False, indent=4))
2024-09-30 16:23:39 +08:00
final_result = process_nested_data(transformed_data)
return final_result
2024-08-29 16:37:09 +08:00
if __name__ == "__main__":
2024-10-30 18:08:46 +08:00
# 测试代码
2024-09-30 17:52:59 +08:00
# file_path = 'C:\\Users\\Administrator\\Desktop\\fsdownload\\3bffaa84-2434-4bd0-a8ee-5c234ccd7fa0\\clause1.json'
2024-10-30 18:08:46 +08:00
file_path = "C:\\Users\\Administrator\\Desktop\\招标文件\\special_output\\clause1.json"
2024-08-29 16:37:09 +08:00
try:
2024-10-30 16:56:05 +08:00
res = extract_from_notice(file_path, 2) # 可以改变此处的 type 参数测试不同的场景
2024-09-30 16:23:39 +08:00
res2 = json.dumps(res, ensure_ascii=False, indent=4)
print(res2)
2024-08-29 16:37:09 +08:00
except ValueError as e:
print(e)