Yufan_Zhou
Fix imports, add generate_user_profile_final, and clean up old directories
0701598
#!/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()