File size: 4,264 Bytes
0701598
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
#!/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()