Spaces:
Running
Running
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()
|