pydicom标签可以通过点符号访问吗?

时间:2019-03-21 19:11:50

标签: pydicom

一个非常简单的pydicom示例涉及读取文件,然后输出Series Time

import pydicom
info = pydicom.dcmread("file.dcm")
print(info.SeriesTime)

因此对于已读取的对象,点表示法可以替代print(info[pydicom.tag.Tag((0x0008, 0x0031))])print(info[0x0008, 0x0031])等更复杂的构造。很好。

现在,pydicom仅支持读取一些标签以提高性能:

info = pydicom.dcmread("file.dcm", specific_tags=['SeriesTime', ])

我不喜欢在代码中使用字符串常量。那么在上面的示例中,'SeriesTime'的可读替代品是什么? specific_tags=[pydicom.tag.Tag((0x0008, 0x0031)), ]并不是特别可读。

理想情况下,我希望能够通过点表示法访问标记字典,例如pydicom.allTags.SeriesTime,但我似乎找不到。

2 个答案:

答案 0 :(得分:1)

您正在寻找的是数据字典。在Pydicom中,您可以在这里找到它: pydicom.datadict.DicomDictionary,但这是元组的决定,它实际上不适合通过点表示法进行访问。例如,要检索“ SeriesTime”,您将必须编写pydicom.datadict.DicomDictionary[524337][4],它既不可读也不保证在Pydicom更新时仍然有效(尽管我怀疑它是否会经常更改)。

您可以使用namedtuple自己实现此目的:

from collections import namedtuple
import pydicom

def get_dict_as_namedtuple(pdict):
    # some keywords are empty, check for those
    keywords_list = [pdict[i][4] for i in pdict if pdict[i][4].strip() != '']
    Keywords = namedtuple('Keywords', keywords_list)
    # unpack the list as positional arguments
    return Keywords(*keywords_list)

dicom_tags = get_dict_as_namedtuple(pydicom.datadict.DicomDictionary)

print(dicom_tags.SeriesTime)
# prints 'SeriesTime'

或者是我最初不太优雅的解决方案(此解决方案无法使用标签自动完成功能):
(通过Fabric codebase找到的this answer中AttributeDict的示例代码)

import pydicom
class AttributeDict(dict):

    def __getattr__(self, key):
        try:
            return self[key]
        except KeyError:
            # to conform with __getattr__ spec
            raise AttributeError(key)

    def __setattr__(self, key, value):
        self[key] = value

    def first(self, *names):
        for name in names:
            value = self.get(name)
            if value:
                return value

def get_data_dict(pydicom_data_dict):
        data_dict = AttributeDict({})
        for entry in pydicom_data_dict:
            keyword = pydicom_data_dict[entry][4]
            data_dict[keyword] = keyword
        return data_dict

pydicom_data_dict = get_data_dict(pydicom.datadict.DicomDictionary)
print(pydicom_data_dict.SeriesTime)
#prints 'SeriesTime'

答案 1 :(得分:1)

这是获得pydicom词典的点对点访问的另一种相对简短的方法:

from pydicom.datadict import tag_for_keyword
from pydicom.tag import Tag

class DottedDcmDict(object):
    def __getattr__(self, name):
        tag = tag_for_keyword(name)
        if tag:
            return Tag(tag)
        raise AttributeError("Not a valid DICOM identifier")

dd = DottedDcmDict()
print(dd.SeriesTime)
(0008, 0031)