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