直供个人参考,1 1.1 1.1.1 1.1.1.1 无限生成json数据结构
第一种方式:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import yaml
def set_data(self, list_data, annotation_level_name, full_name):
for i, item in enumerate(list_data):
item_key = item if isinstance(item, str) else list(item.keys())[0]
item_level_name = item_key.split("_")[0]
if annotation_level_name[0:annotation_level_name.rfind(".")] == item_level_name:
if isinstance(item, str):
list_data[i] = {item_key: []}
list_data[i][item_key].append(full_name)
return True
else:
if isinstance(item, dict) and self.set_data(list_data[i][item_key], annotation_level_name, full_name):
return True
return False
def load_category_download_yaml(self, param):
filename_english = param['filename_english'][0].decode()
first_file_sql = "select e.annotation_full_name, e.annotation_level_name, e.`level`, e.annotation_file_name, c.annotation_full_name " \
" from annotation_file_info e left join annotation_file_info_chinese c on e.annotation_level_name = c.annotation_level_name " \
" and concat(e.annotation_file_name, '_translate') = c.annotation_file_name where e.annotation_file_name = '{0}'".format(filename_english)
res = self.db.execute_sql(first_file_sql)
res = sorted(res, key=lambda data: [int(i) for i in data[1].split(".")])
list_data = []
for annotation_full_name, annotation_level_name, level, annotation_file_name, chinese_full_name in res:
full_name = annotation_full_name + ',' + (chinese_full_name if chinese_full_name else annotation_full_name)
if level == 1:
list_data.append(full_name)
else:
self.set_data(list_data, annotation_level_name, full_name)
return yaml.safe_dump(list_data, allow_unicode=True)
第二种方式:
def load_category_download_yaml(self, param):
filename_english = param['filename_english'][0].decode()
first_file_sql = "select e.annotation_full_name, e.annotation_level_name, e.`level`, e.annotation_file_name, c.annotation_full_name " \
" from annotation_file_info e left join annotation_file_info_chinese c on e.annotation_level_name = c.annotation_level_name " \
" and concat(e.annotation_file_name, '_translate') = c.annotation_file_name where e.annotation_file_name like'%{}%'".format(filename_english)
res = self.db.execute_sql(first_file_sql)
# 排序
sort_level_name = sorted(res, key=lambda x : [int(i) for i in x[1].split('.')], reverse=False)
map = {}
first_key = []
for full_name, level_name, level, file_name, chinese_full_name in sort_level_name:
ann_chin_full_name = full_name+","+ chinese_full_name if chinese_full_name else full_name
entry = {'full_name': ann_chin_full_name, 'level_name': level_name}
if level == 1:
first_key.append({ann_chin_full_name: level_name})
map[full_name] = []
else:
key = str(level_name)[0: str(level_name).rfind(".")]
if key in map.keys():
map[key].append(entry)
else:
map[key] =[entry]
data_all = []
result_data = {}
for key in first_key:
key_full_name = list(key.keys())[0]
result_data = { key_full_name: self.recursion_yaml(map, key[key_full_name]) }
data_all.append(result_data)
return yaml.safe_dump(data_all, allow_unicode=True)
def recursion_yaml(self, map, first_key):
if first_key in map.keys():
if first_key != None:
list_c = []
for i in map.get(first_key):
test_result = self.recursion_yaml(map, i['level_name'])
if test_result == None:
list_c.append(i['full_name'])
else:
map1 = {i['full_name']: test_result}
list_c.append(map1)
return list_c
return None