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

使用Uproot提取ROOT文件中带版本的TTree至新文件遇写入问题

解决Uproot提取带版本号TTree并保存为新文件的问题

问题背景

需要从ROOT文件中提取带版本后缀的TTree(如TreeName;3),重命名后保存为独立的树到新ROOT文件中,尝试多种方法均报错,以下是错误分析和解决方案。


错误分析与对应解法

1. 直接赋值TTree对象报错 NotImplementedError: this ROOT type is not writable: TTree

原因:Uproot的WritableDirectory不支持直接写入TTree对象,必须通过读取树的实际数据,再创建新的TTree写入。

2. 用typenames()创建树报错 ValueError: 'extend' must fill every branch with the same number of entries

原因:ttree.typenames()仅返回分支类型字典,没有实际数据,且对于变长数组分支(如double[]),仅提供类型无法让Uproot正确初始化树结构。

3. 写入numpy数组报错 TypeError: cannot write Awkward Array type to ROOT file: unknown

原因:numpy无法很好地表示ROOT中的变长数组分支,Uproot对变长数组的处理依赖Awkward Array结构,直接用numpy数组会导致类型不兼容。


正确实现代码

import uproot

# 打开输入文件和创建输出文件
with uproot.open("old_file.root") as in_file:
    with uproot.recreate("new_file.root") as out_file:
        # 遍历输入文件中的所有键
        for key in in_file.keys():
            obj = in_file[key]
            # 仅处理TTree类型的对象
            if isinstance(obj, uproot.TTree):
                # 重命名:替换版本号分隔符;为_
                new_name = key.replace(";", "_")
                # 读取所有分支数据,默认用Awkward Array(完美支持变长数组)
                arrays = obj.arrays()
                # 将数据写入新文件,Uproot自动根据数组结构创建对应分支
                out_file[new_name] = arrays

关键说明

  • 筛选TTree:遍历文件键时,通过isinstance(obj, uproot.TTree)确保只处理树对象,避免其他ROOT对象干扰。
  • Awkward Array的优势:原生支持ROOT中的变长数组、嵌套结构,Uproot能直接根据其结构推断出正确的TTree分支类型,解决了numpy无法处理变长数组的问题。
  • 自动类型推断:写入Awkward Array时,Uproot会自动匹配对应的ROOT类型(如double[]对应Awkward的变长数组),无需手动指定类型,避免了类型不匹配的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 02:35:33