如何在pydicom中读取标签值长度而非值并获取文件偏移?
使用pydicom公共API获取大DICOM标签的长度与文件偏移(无需加载完整数据)
问题背景
需要获取DICOM文件中长标签值的长度,以及该数据在文件中的起始/结束偏移位置,但不想加载1.5GB的实际数据。当前使用dcmread指定specific_tags时速度很快,但通过dataset[tag]访问元素会自动加载全部数据,耗时达半秒。
初始实现(会触发数据加载):
# python bug.py && tuna bug.prof import cProfile import pydicom def bug(): path = "C:\\Data\\bug.ima" tag = pydicom.tag.Tag(0x7FE1, 0x1010) dataset = pydicom.dcmread(path, specific_tags=[tag], defer_size=0) element = dataset[tag] _a = element.file_tell _b = len(element.value) cProfile.run("bug()", filename="bug.prof")
现有两种非公共API的 workaround:
私有API方式
# python bug.py && tuna bug.prof import cProfile import pydicom def bug(): path = "C:\\Data\\bug.ima" tag = pydicom.tag.Tag(0x7FE1, 0x1010) dataset = pydicom.dcmread(path, specific_tags=[tag], defer_size=0) element = dataset._dict[tag] _a = element.value_tell _b = element.length cProfile.run("bug()", filename="bug.prof")
非标准API方式
# python bug.py && tuna bug.prof import cProfile import pydicom def bug(): path = "C:\\Data\\bug.ima" tag = pydicom.tag.Tag(0x7FE1, 0x1010) dataset = pydicom.dcmread(path, specific_tags=[tag], defer_size=0) dataset = dataset.__array__().item() element = dataset[tag] _a = element.value_tell _b = element.length cProfile.run("bug()", filename="bug.prof")
公共API解决方案
使用pydicom提供的get_raw_element()公共方法,可直接获取未加载的原始元素对象,避免触发数据加载:
# python bug.py && tuna bug.prof import cProfile import pydicom def bug(): path = "C:\\Data\\bug.ima" tag = pydicom.tag.Tag(0x7FE1, 0x1010) # 保持延迟加载配置,仅读取指定标签 dataset = pydicom.dcmread(path, specific_tags=[tag], defer_size=0) # 公共API获取原始元素,不触发值加载 element = dataset.get_raw_element(tag) # 获取值的起始偏移(公共方法) start_offset = element.value_tell() # 获取值的长度(公共属性) value_length = element.length # 计算结束偏移 end_offset = start_offset + value_length cProfile.run("bug()", filename="bug.prof")
说明
get_raw_element(tag):公共API,返回元素的原始表示(如DeferredElement),不会自动解析或加载延迟元素的值element.length:公共属性,直接返回标签值的字节长度,无需读取实际数据element.value_tell():公共方法,返回标签值在文件中的起始偏移位置,结合length即可计算结束偏移
内容的提问来源于stack exchange,提问作者bers
相关产品推荐
相关产品推荐

