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
相关产品推荐
相关产品推荐

