You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python筛选ROOT文件TTree分支并修改分支名称?

最优实现方案

Python环境下优先选用uproot实现该需求,该方案不需要依赖完整ROOT框架,读写效率远高于PyROOT绑定方案,且完全支持你提到的uproot.recreate创建新ROOT文件的操作。

核心实现逻辑

你只需要提前构造旧分支名到新分支名的映射字典,仅把需要保留的40个分支纳入映射范围,读取原TTree时只加载目标分支,重命名后直接写入新文件即可,步骤如下:

  1. 定义分支映射规则:键为原文件旧分支名,值为修改后的新分支名
  2. 读取原ROOT文件内的目标TTree,仅加载映射范围内的分支
  3. 按映射关系重命名分支后,写入新ROOT文件的TTree中

可直接运行的示例代码

import uproot

# 按需修改为你自己的分支映射规则,仅保留需要的40个分支即可
branch_mapping = {
    "old_branch_1": "new_branch_1",
    "old_branch_2": "new_branch_2",
    # 剩余38个分支的映射关系自行补全
}

# 读取原ROOT文件的TTree,替换为你自己的原文件名和TTree名
with uproot.open("input.root:your_old_tree_name") as old_tree:
    # 仅加载目标分支,避免多余内存占用
    selected_data = old_tree.arrays(filter_name=list(branch_mapping.keys()))
    # 按映射规则重命名分支
    renamed_data = {branch_mapping[old_name]: selected_data[old_name] for old_name in branch_mapping}
    
    # 创建新ROOT文件,写入重命名后的TTree
    with uproot.recreate("output.root") as new_file:
        # 可自行修改新TTree的名称,也可保留和原TTree一致的名称
        new_file["your_new_tree_name"] = renamed_data

特殊场景适配

  • 如果需要保留原分支的压缩参数、单位、注释等元信息,可在读取时通过old_tree[old_branch].title、old_tree[old_branch].compression等属性取出元信息,写入新文件时传入对应参数即可
  • 数据量过大内存不足时,可指定arrays方法的entry_start、entry_stop参数分块读写,逐段写入新TTree

内容的提问来源于stack exchange,提问作者Dizzy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 09:45:04