问题描述
我在给定路径上确实存在的DICOM文件上遇到dcmread()
问题。我不确定出了什么问题。这是我的代码:
import pydicom
f = "/exact/path/hi.dcm"
fn = get_testdata_file(f)
ds = pydicom.dcmread(fn)
ds.soPClassUID = ds.MediaStorageSOPClassUID
我遇到以下错误:
Traceback (most recent call last):
File "addfields.py",line 14,in <module>
ds = pydicom.dcmread(fn)
File "/Users/user/opt/anaconda3/lib/python3.7/site-packages/pydicom/filereader.py",line 871,in dcmread
force=force,specific_tags=specific_tags)
File "/Users/user/opt/anaconda3/lib/python3.7/site-packages/pydicom/filereader.py",line 668,in read_partial
preamble = read_preamble(fileobj,force)
File "/Users/user/opt/anaconda3/lib/python3.7/site-packages/pydicom/filereader.py",line 605,in read_preamble
preamble = fp.read(128)
AttributeError: 'nonetype' object has no attribute 'read'
但是我不确定为什么,因为“ hi.dcm”是一个存在的文件(路径正确)并且内部包含元数据。我不知道什么是序言,以及它是否出现在我正在处理的图像中。
解决方法
免责声明:我是pydicom的撰稿人。
发生错误是因为get_testdata_file
返回None
,然后将其用作文件名。错误消息本身有点误导-在这种情况下,提高FileNotFound
或ValueError
可能会更好。相反,发生的事情是,首先读取的是前同步码(DICOM图像的标记,该标记由128个零字节组成,后跟'DICM'),并且在尝试读取该标记时,由于文件指针为{{ 1}}。
这是documentation for get_testdata_file
:
返回具有文件名的第一个匹配数据集的绝对路径。
首先搜索本地pydicom数据存储,然后搜索任何本地可用的外部源,最后搜索pydicom / pydicom-data存储库中可用的文件。
因此这是一个便捷功能,主要用于查找pydicom测试数据文件。
如果您已经有了文件路径,则可以使用它:
None
对于前同步码,如果DICOM文件没有前同步码(旧的ACR-NEMA格式),则可以使用import pydicom
fn = "/exact/path/hi.dcm"
ds = pydicom.dcmread(fn)
参数读取此类文件:
force=True
尽管只有在您确实有这样的文件时才使用它,因为它还会尝试将非DICOM文件作为DICOM处理,这可能会导致一些意外的异常。如前所述,这种情况下的错误与丢失的前导码无关,而是与错误的文件路径有关。
更新:
在当前主版本以及ds = pydicom.dcmread(fn,force=True)
的未来2.1版本中,此行为已更改。如果通过pydicom
,dcmread
现在将通过有意义的消息引发TypeError
。