#!/usr/bin/env python3 """ 统计 attributes_merged.json 文件中的节点数量 该脚本递归遍历 JSON 文件中的所有嵌套结构,统计所有的键(节点)数量。 每个键都被视为一个节点,无论其值是空对象还是包含更多嵌套结构的对象。 """ import json import os def count_nodes_recursive(data): """ 递归统计 JSON 对象中的节点数量 Args: data: JSON 对象(字典或其他数据类型) Returns: int: 节点总数 """ if not isinstance(data, dict): return 0 count = 0 for key, value in data.items(): # 每个键都算作一个节点 count += 1 # 如果值是字典,递归统计其中的节点 if isinstance(value, dict): count += count_nodes_recursive(value) return count def analyze_json_structure(data, level=0, max_display_level=3): """ 分析并显示 JSON 结构的层次信息 Args: data: JSON 对象 level: 当前层级 max_display_level: 最大显示层级 Returns: dict: 包含统计信息的字典 """ if not isinstance(data, dict): return {"nodes": 0, "levels": 0, "leaf_nodes": 0} stats = {"nodes": 0, "levels": level + 1, "leaf_nodes": 0} for key, value in data.items(): stats["nodes"] += 1 if level < max_display_level: indent = " " * level print(f"{indent}- {key}") if isinstance(value, dict): if len(value) == 0: # 空字典视为叶子节点 stats["leaf_nodes"] += 1 else: # 递归分析子结构 sub_stats = analyze_json_structure(value, level + 1, max_display_level) stats["nodes"] += sub_stats["nodes"] stats["levels"] = max(stats["levels"], sub_stats["levels"]) stats["leaf_nodes"] += sub_stats["leaf_nodes"] else: # 非字典值视为叶子节点 stats["leaf_nodes"] += 1 return stats def main(): """主函数""" file_path = "/home/zhou/deeppersona/generate_user_profile_final/data/attributes_merged.json" # 检查文件是否存在 if not os.path.exists(file_path): print(f"错误: 文件 {file_path} 不存在") return try: # 读取 JSON 文件 print(f"正在读取文件: {file_path}") with open(file_path, 'r', encoding='utf-8') as f: data = json.load(f) print("=" * 60) print("JSON 文件节点统计结果") print("=" * 60) # 统计总节点数 total_nodes = count_nodes_recursive(data) print(f"总节点数量: {total_nodes}") # 详细结构分析 print("\n" + "=" * 60) print("结构分析") print("=" * 60) print("\n前3层结构预览:") print("-" * 30) stats = analyze_json_structure(data) print(f"\n详细统计信息:") print(f"- 总节点数: {stats['nodes']}") print(f"- 最大层级深度: {stats['levels']}") print(f"- 叶子节点数: {stats['leaf_nodes']}") print(f"- 中间节点数: {stats['nodes'] - stats['leaf_nodes']}") # 计算文件大小 file_size = os.path.getsize(file_path) print(f"\n文件信息:") print(f"- 文件大小: {file_size:,} 字节 ({file_size/1024:.2f} KB)") print(f"- 平均每个节点: {file_size/total_nodes:.2f} 字节") # 顶层分类统计 if isinstance(data, dict): print(f"\n顶层分类数量: {len(data)}") print("顶层分类列表:") for i, key in enumerate(data.keys(), 1): sub_count = count_nodes_recursive(data[key]) print(f" {i:2d}. {key}: {sub_count} 个子节点") except json.JSONDecodeError as e: print(f"JSON 解析错误: {e}") except FileNotFoundError: print(f"文件未找到: {file_path}") except Exception as e: print(f"发生错误: {e}") if __name__ == "__main__": main()