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

Uproot访问含斜杠键名的ROOT文件对象报错咨询

uproot读取键名含斜杠ROOT对象的解决方案

uproot默认对传入的字符串键做类POSIX路径解析,/会被识别为目录层级分隔符。当键名本身包含/字符时,uproot会错误拆分键名、尝试匹配不存在的子目录,最终触发键不存在的报错。

推荐方案(全版本兼容,无需额外遍历)

使用(键名字面量, cycle号)的元组作为索引,该索引方式会跳过所有路径解析逻辑,在当前目录下做精确的键名匹配,不会处理键名内的/字符:

import uproot
f = uproot.open("myfile.root")
# 第二个参数传None表示自动匹配最新版本(cycle号最大)的对象
hist = f["DQMInfo/runno", None]

# 如果明确知道对象cycle号为1,也可以直接指定
# hist = f["DQMInfo/runno", 1]

其他可行方案

遍历根目录键匹配原始名称

可以关闭递归遍历配置,直接读取根目录下存储的原始键对象做匹配,完全绕开路径拼接逻辑:

import uproot
f = uproot.open("myfile.root")
hist = None
# recursive=False 不递归进入子目录,full_paths=False 返回原始键名不做路径拼接
for key in f.keys(recursive=False, full_paths=False):
    if key.name == "DQMInfo/runno":
        hist = key.get()
        break

字节串访问的正确写法

你之前传入字节串触发类型错误,是因为字节串索引要求传入和ROOT文件内存储完全一致的带cycle后缀的键名(即报错提示里的DQMInfo/runno;1格式),你传入的字节串缺少cycle后缀,触发了内部解析的类型报错。正确写法如下:

import uproot
f = uproot.open("myfile.root")
# 必须和文件内存储的完整键名完全一致,带cycle号后缀
hist = f[b"DQMInfo/runno;1"]

该方式需要提前知道准确的cycle号,灵活度低于元组索引,不做优先推荐。

注意事项

不需要通过重命名键的方式解决问题:上述方法都可以直接读取到目标对象,重命名需要写入修改原文件或生成新文件,效率低且存在损坏原始数据的风险,完全没有必要。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 18:42:34